【发布时间】:2015-05-26 04:39:24
【问题描述】:
问题背景:
我的 MVC 应用中有一个页面允许用户提交问题,如下所示:
按下“发送”按钮后,将显示带有 Spinner 的模态弹出窗口以显示消息正在发送,然后一旦成功发送,模态内容将被更改以通过适当的消息反映这一点。
潜在的设计问题:
目前我正在使用 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');
}
});
});
SendMail 方法通过 AJAX POST 请求获取联系人页面发送的参数:
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"});
}
【问题讨论】:
-
您当前的实现没问题。没有什么能阻止您使用具有相同字段名称的 inputmodel。在某些情况下,您可以编写自己的模型绑定器。
-
您能否解释一下 - “..A Form 将允许我通过 ViewModel 发送这些”?您的意思是动作输入模型?另外,SendMail 是断章取义的,它不是操作方法。
-
@AntonPutau 谢谢cmets。我正在考虑使用一个 Html.BeginForm,然后我可以绑定到一个 ViewModel(它具有发送到 SendMail 方法的名称、电子邮件、主题和消息的公共属性。
标签: jquery ajax asp.net-mvc