问题背景:
我的MVC应用中有一个页面,允许用户提交问题,如下所示:
按下发送按钮后,会显示带有微调器的模态弹出窗口以显示正在发送的消息,然后一旦成功发送,则将更改模态内容以反映此消息。
潜在的设计问题:
目前我正在使用AJAX将文本框值发布到名为Contact
的控制器,该控制器有一个名为SendMail
的方法
AJAX POST功能:
<script>
$("#SendMessage").click(function (e) {
$("#SendingModal").modal('show');
$.ajax({
url: '@Url.Action("SendMail")',
type: 'POST',
data: {
"name": $('#name').val(),
"email": $('#email').val(),
"subject": $('#subject').val(),
"message": $('#message').val()
},
success: function () {
$('#contactForm').html('<div class="row">' +
'<div class="col-lg-12 col-md-12 col-sm-12">' +
'<div class="jumbotron jumbotronPadding">' +
'<h2>Message sent</h2>' +
'<p><h3>Thank your for your enquiry, we will reply as soon as possible.</h3></p>' +
'</div>' +
'</div>' +
'</div>');
$('#SendingModal').modal('hide');
}
});
});
通过AJAX POST请求获取从Contact页面发送的参数的SendMail
方法:
public void SendMail(string name, string email, string subject, string message)
{
var mailMessage = new EmailContactHandler();
mailMessage.SendMail(name, email, subject, message);
}
我应该使用Html Form
代替当前的AJAX调用吗?目前,我将每个单独的文本框值发布到SendMail
方法的相关参数值,即名称,电子邮件,主题,消息。表单允许我通过ViewModel
发送这些表单。我目前的实施是否正常?如果不是更好的方法(理想情况下使用某种模型)
更新
在阅读了Mackans的回答之后,我重构了代码以映射到一个名为Contact的模型,该模型在AJAX请求中设置数据属性。
AJAX请求:
<script>
$("#SendMessage").click(function (e) {
$("#dialog-example").modal('show');
$.ajax({
url: '@Url.Action("SendMail")',
type: 'POST',
data: {
name: $('#name').val(),
email: $('#email').val(),
subject: $('#subject').val(),
message: $('#message').val()
},
success: function (message) {
if (message.messageStatus === "success") {
$('#contactForm').html('<div class="row">' +
'<div class="col-lg-12 col-md-12 col-sm-12">' +
'<div class="jumbotron jumbotronPadding">' +
'<h2>Message sent</h2>' +
'<p><h3>Thank your for your enquiry, we will reply as soon as possible.</h3></p>' +
'</div>' +
'</div>' +
'</div>');
}
$('#dialog-example').modal('hide');
}
});
});
联系模式:
public class Contact
{
public string Name { set; get; }
public string Email { set; get; }
public string Subject { set; get; }
public string Message { set; get; }
}
控制器上的SendMail
方法现在采用名为Contact的模型实例。
public ActionResult SendMail(Contact emailMessage)
{
var mailMessage = new EmailContactHandler();
mailMessage.SendMail(emailMessage);
return Json(new { messageStatus = "success"});
}
答案 0 :(得分:1)
您的设计有效,但正如您所说,您错过了 MVC 中的 M 。幸运的是,您无需在Ajax和模型之间进行选择。
唯一的问题是有很多选项可供选择,在所有选项上编写详细的演练都不适合这种格式。简单地说:
您可以将模型和Html.BeginForm()
或类似内容添加到当前解决方案中,并在当前代码中处理它。该模型通常在控制器中没有问题绑定..
e.preventDefault(); //to prevent normal submit
$.ajax({
url: '@Url.Action("SendMail")',
type: 'POST',
data: $('#myform').serialize(),
...
控制器:
[HttpPost]
public void SendMail(MyModel model)
您也可以使用Microsofts Ajax扩展:
@using (Ajax.BeginForm("MyAction", "MyController", new AjaxOptions
{
HttpMethod = "POST",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "myTargetElementId"
}))
有很多good options available。但是只使用jQuery无法做到这一点。这只是一个偏好问题,它们可以混合搭配。
有关这些方法及其他方法的详细信息,请搜索SO或Google。周围有很多很好的指南。
另外,既然你在询问潜在的问题。我会从SendMail
方法返回某种形式的成功或失败。 Ajax的成功只能告诉你方法是否被成功调用,而不是结果是什么。