Asp.net mvc 如何从ASP.NET MVC 5中的HTTP POST将单个字符串返回到当前页面中的div?

Asp.net mvc 如何从ASP.NET MVC 5中的HTTP POST将单个字符串返回到当前页面中的div?,asp.net-mvc,http-post,actionresult,actionmethod,Asp.net Mvc,Http Post,Actionresult,Actionmethod,我试图在联系人表单之后发布一条消息,向用户表明他们的消息在单击submit按钮后已发送。我不想重定向到其他页面,也不想在HTTP Post操作方法中返回其他视图。在ASP.NET MVC框架中,我如何做类似的事情 下面是我的代码示例: @*contactus.cshtml*@ @model MySite.Models.ContactModel @using (Html.BeginForm()) {

我试图在联系人表单之后发布一条消息,向用户表明他们的消息在单击submit按钮后已发送。我不想重定向到其他页面,也不想在HTTP Post操作方法中返回其他视图。在ASP.NET MVC框架中,我如何做类似的事情

下面是我的代码示例:

@*contactus.cshtml*@
            @model MySite.Models.ContactModel
            @using (Html.BeginForm())
            {
                <div class="col-md-6">
                    <div class="form-group">
                        @Html.TextBoxFor(model => model.Name})
                        <p>@Html.ValidationMessageFor(model => model.Name)</p>
                    </div>
                    <div class="form-group">
                        @Html.TextBoxFor(model => model.Email)
                        <p>@Html.ValidationMessageFor(model => model.Email)</p>
                    </div>
                    <div class="form-group">
                        @Html.TextAreaFor(model => model.Message)
                        <p>@Html.ValidationMessageFor(model => model.Message)</p>
                    </div>

                    <div class="col-lg-12">
                        <button type="submit">Send Message</button>
                    </div>
                </div>
            }

@*ContactModel.cs*@
public class ContactModel
{
    [Required(ErrorMessage = "* Please enter your name.")]
    [StringLength(100, MinimumLength=3, ErrorMessage="* Please enter your full name.")]
    public string Name { get; set; }

    [Required]
    [EmailAddress(ErrorMessage="* Not a valid email address.")]
    public string Email { get; set; }

    [Required]
    public string Message { get; set; }
}

现在,这个控制器将返回
Content
中的字符串,它将替换我的整个页面,我希望该字符串返回到我的联系人表单下面。另外,我在同一个html页面上有两个部分,其中的联系人表单与第二个相同,当我返回视图(模型)时,它会自动重定向到第一个部分,这并不理想。。。如何告诉控制器仅将其重定向到POST方法之后的第二部分?另外,我觉得如果它不返回整个页面的话,效率会更高。。。那么,有没有办法只将消息字符串返回到div?

您可以在包含消息的页面上放置一个隐藏的div

然后,在提交表单后,捕获按钮的单击事件,并使用该事件显示隐藏消息


如果您需要代码示例,请告诉我。发布您的表单将有助于我们更具体地回答您的问题。

您可以在包含邮件的页面上放置一个隐藏的div

然后,在提交表单后,捕获按钮的单击事件,并使用该事件显示隐藏消息


如果您需要代码示例,请告诉我。发布您的表单将有助于我们更具体地回答您的问题。

若要仅在表单成功发送时显示成功消息,我建议在控制器的POST操作中的ViewBag中设置一个值,然后如果您仍希望显示相同的页面,则返回该页面。在视图本身上,您可以放置一个If语句来测试ViewBag变量是否包含值,如果包含值,则显示消息

控制器:

[HttpPost]
public ActionResult YourAction(YourModel m)
{
    //Do stuff to send the contact form
    ...
    if(error)
    {
        ViewBag.Message = "There was a problem sending the form.";
    }
    else
    {
        ViewBag.Message = "The form was sent successfully!";
    }
    return View(m);
}
public void AJAXPostContactForm(string name, string email, string message)
{
    try
    {
        //do stuff with the information passed into the action
    }
    catch(exception e)
    {
        //Handle errors. If error thrown, Ajax should hit fail block in script
    }
    finally
    {
        //do any cleanup actions
    }
}
视图:

视图:



我还没有测试过这段代码,但理论上它应该可以工作。单击特定的按钮,它将从表单字段中获取值,将这些值发布到控制器中的专用ActionResult,然后返回一条有关发生情况的消息。

仅在表单成功发送时显示成功消息,我建议在控制器的POST操作中的ViewBag中设置一个值,然后返回相同的页面(如果您仍希望显示相同的页面)。在视图本身上,您可以放置一个If语句来测试ViewBag变量是否包含值,如果包含值,则显示消息

控制器:

[HttpPost]
public ActionResult YourAction(YourModel m)
{
    //Do stuff to send the contact form
    ...
    if(error)
    {
        ViewBag.Message = "There was a problem sending the form.";
    }
    else
    {
        ViewBag.Message = "The form was sent successfully!";
    }
    return View(m);
}
public void AJAXPostContactForm(string name, string email, string message)
{
    try
    {
        //do stuff with the information passed into the action
    }
    catch(exception e)
    {
        //Handle errors. If error thrown, Ajax should hit fail block in script
    }
    finally
    {
        //do any cleanup actions
    }
}
视图:

视图:



我还没有测试过这段代码,但理论上它应该可以工作。单击一个特定的按钮,它将从表单字段中获取值,将这些值发布到控制器中的专用ActionResult,然后返回一条有关发生情况的消息。

非常感谢您的及时响应!我现在将添加一个代码示例。由于我使用的是ASP.NET,有没有一种方法可以使用C#捕获点击事件,或者我必须使用JQuery?您可以使用C#捕获它,但由于您使用的是MVC,所以最好使用Javascript或JQuery。为了避免这样一个简单功能的回发,您所能做的任何事情都会加快页面的速度。当然,您可能会进行回发以提交表单,但将消息保留在该页面上仍会使用户的速度大大加快。这是有道理的。非常感谢。我将使用JQuery捕获按钮单击。我还能用HomeController发送我的表格吗?你当然可以。如果您需要代码方面的帮助,请告诉我。是的,请!一些示例代码将帮助我这么多!我做了一些研究,写了一些剧本,但都没有成功。我可以让AJAX调用我的控制器,但是不管控制器返回什么,返回的值总是在新页面上,而不是我当前页面上的div。。。提前非常感谢你!!!非常感谢您的及时回复!我现在将添加一个代码示例。由于我使用的是ASP.NET,有没有一种方法可以使用C#捕获点击事件,或者我必须使用JQuery?您可以使用C#捕获它,但由于您使用的是MVC,所以最好使用Javascript或JQuery。为了避免这样一个简单功能的回发,您所能做的任何事情都会加快页面的速度。当然,您可能会进行回发以提交表单,但将消息保留在该页面上仍会使用户的速度大大加快。这是有道理的。非常感谢。我将使用JQuery捕获按钮单击。我还能用HomeController发送我的表格吗?你当然可以。如果您需要代码方面的帮助,请告诉我。是的,请!一些示例代码将帮助我这么多!我做了一些研究,写了一些剧本,但都没有成功。我可以让AJAX调用我的控制器,但是不管控制器返回什么,返回的值总是在新页面上,而不是我当前页面上的div。。。提前非常感谢你!!!哦,很好地使用了ViewBag!非常感谢。我的另一个担忧是,由于我在同一页面上有两个部分,其中的联系人表单与第二个相同,当我返回视图(模型)时,它会自动重定向到第一个部分,这并不理想。。。如何告诉控制器仅将其重定向到第二部分?另外,我觉得如果它不返回整个页面,它会更有效率…再次非常感谢您的快速响应!!您可以使用AJAX调用来发布表单。您仍然需要在服务器上处理表单,但页面本身不必重新加载。这也可能解决返回页面顶部的问题,因为页面不会重新加载。然而,
public void AJAXPostContactForm(string name, string email, string message)
{
    try
    {
        //do stuff with the information passed into the action
    }
    catch(exception e)
    {
        //Handle errors. If error thrown, Ajax should hit fail block in script
    }
    finally
    {
        //do any cleanup actions
    }
}
<div id="successMessage"></div>