如何从 ASP.NET MVC 5 中的 HTTP POST return 到我当前页面中的 div 的单个字符串?
How to return a single string to a div in my current page from HTTP POST in ASP.NET MVC 5?
我正在尝试 post 在联系表单后发送一条消息,向用户表明他们的消息已在他们单击提交按钮后发送。我不想重定向到不同的页面或 return 我的 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; }
}
我的 home/index 页面上现在只有一个联系我们表单,我不想将它重定向到任何其他页面。我想在 Send Message
按钮正下方显示一条消息,但我不确定如何使用下面的操作方法:
@*HomeController.cs*@
public ActionResult Index(ContactModel model)
{
if (ModelState.IsValid)
{
// this is my helper library, for brevity, I'm not copying it.
EmailHelper emailService = new EmailHelper();
bool success = emailService.SendEmail(model.Name, model.Email, model.Message);
return Content(success ? "success" : "no...something went wrong :(");
} else {
return View(model);
}
}
现在这个控制器将 return Content
中的字符串替换我的整个页面,我希望该字符串 return 在我的联系表单下方编辑。另外,我在同一个 html 页面上有两个部分,第二部分是联系表单,当我 return 查看(模型)时,它会自动重定向到第一部分,这并不理想。 . 我如何告诉控制器只将它重定向到 POST 方法之后的第二部分?另外,我觉得如果它不 return 整个页面会更有效率......那么有没有办法只 return 一个消息字符串到 div?
您可以在将包含消息的页面上放置一个隐藏的 div。
然后在提交表单后,捕获按钮的点击事件,并使用它来显示隐藏的消息。
如果您需要代码示例,请告诉我。发布您的表单将有助于我们更具体地回答您。
为了仅在成功发送表单时显示成功消息,我建议在控制器的 POST 操作中的 ViewBag 中设置一个值,然后 returning 同一页面,如果您仍然希望显示相同的页面。然后,您可以在视图本身上放置一个 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);
}
查看:
@if(ViewBag.Message != null)
{
<div>@ViewBag.Message</div>
}
这让您可以在将结果告诉用户之前检查表单是否在服务器上 post 成功编辑,并且只有在设置了 ViewBag.Message 时才会显示一条消息。请注意,您可以拥有任意数量的 ViewBag 变量,并且可以根据需要为它们命名......只要记住您在哪个地方使用哪个变量即可。
编辑:
根据评论,这也可以使用 AJAX 调用来完成。为了简单起见,我将使用 jQuery .post() 方法。
在脚本中:
<script>
$(document).on('click', "#buttonId", function() {
var nameText = $("#IdOfNameField").val();
var emailText = $("#IdOfEmailField").val();
var messageText = $("#IdOfMessageField").val();
$.post('@Url.Content("~/Controller/AJAXPostContactForm")',//the url to post to
{name: nameText, email: emailText, message: messageText }, //these are values to be sent to the action
function(){ //this is the success function
$("#successMessage").val("Form posted successfully.");
}
)
.fail(function() {//failure function
alert("Something went wrong.");
});
}
</script>
控制器:
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>
我没有测试过这段代码,但理论上应该可以。单击特定按钮时,它将从表单字段中获取值,post 这些值到控制器中的专门 ActionResult,然后 return 一条关于所发生情况的消息。
我正在尝试 post 在联系表单后发送一条消息,向用户表明他们的消息已在他们单击提交按钮后发送。我不想重定向到不同的页面或 return 我的 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; }
}
我的 home/index 页面上现在只有一个联系我们表单,我不想将它重定向到任何其他页面。我想在 Send Message
按钮正下方显示一条消息,但我不确定如何使用下面的操作方法:
@*HomeController.cs*@
public ActionResult Index(ContactModel model)
{
if (ModelState.IsValid)
{
// this is my helper library, for brevity, I'm not copying it.
EmailHelper emailService = new EmailHelper();
bool success = emailService.SendEmail(model.Name, model.Email, model.Message);
return Content(success ? "success" : "no...something went wrong :(");
} else {
return View(model);
}
}
现在这个控制器将 return Content
中的字符串替换我的整个页面,我希望该字符串 return 在我的联系表单下方编辑。另外,我在同一个 html 页面上有两个部分,第二部分是联系表单,当我 return 查看(模型)时,它会自动重定向到第一部分,这并不理想。 . 我如何告诉控制器只将它重定向到 POST 方法之后的第二部分?另外,我觉得如果它不 return 整个页面会更有效率......那么有没有办法只 return 一个消息字符串到 div?
您可以在将包含消息的页面上放置一个隐藏的 div。
然后在提交表单后,捕获按钮的点击事件,并使用它来显示隐藏的消息。
如果您需要代码示例,请告诉我。发布您的表单将有助于我们更具体地回答您。
为了仅在成功发送表单时显示成功消息,我建议在控制器的 POST 操作中的 ViewBag 中设置一个值,然后 returning 同一页面,如果您仍然希望显示相同的页面。然后,您可以在视图本身上放置一个 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);
}
查看:
@if(ViewBag.Message != null)
{
<div>@ViewBag.Message</div>
}
这让您可以在将结果告诉用户之前检查表单是否在服务器上 post 成功编辑,并且只有在设置了 ViewBag.Message 时才会显示一条消息。请注意,您可以拥有任意数量的 ViewBag 变量,并且可以根据需要为它们命名......只要记住您在哪个地方使用哪个变量即可。
编辑:
根据评论,这也可以使用 AJAX 调用来完成。为了简单起见,我将使用 jQuery .post() 方法。
在脚本中:
<script>
$(document).on('click', "#buttonId", function() {
var nameText = $("#IdOfNameField").val();
var emailText = $("#IdOfEmailField").val();
var messageText = $("#IdOfMessageField").val();
$.post('@Url.Content("~/Controller/AJAXPostContactForm")',//the url to post to
{name: nameText, email: emailText, message: messageText }, //these are values to be sent to the action
function(){ //this is the success function
$("#successMessage").val("Form posted successfully.");
}
)
.fail(function() {//failure function
alert("Something went wrong.");
});
}
</script>
控制器:
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>
我没有测试过这段代码,但理论上应该可以。单击特定按钮时,它将从表单字段中获取值,post 这些值到控制器中的专门 ActionResult,然后 return 一条关于所发生情况的消息。