我正在尝试使用ViewModel创建我认为非常简单的表单提交。我已经开始工作了一整天,由于某种原因无法理解为什么当我的应用程序进入我的HttpPost操作时,我的EmailViewModel是空的。我收到“NullReference异常发生”“对象引用未设置为对象的实例”错误。
你能看看我的代码并告诉我我疯了吗?
这是我的httpPost动作:
[HttpPost]
public ActionResult SendStudentAnEmail(EmailViewModel email)
{
Debug.Write(email.Subject); // First NullReferenceException
Debug.Write(email.Body);
Debug.Write(email.Email);
etc. . .
我的ViewModel:
namespace MyApp.ViewModels
{
public class EmailViewModel
{
public string Email { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
}
}
和我的观点:
@model MyApp.ViewModels.EmailViewModel
@{
ViewBag.Title = "SendStudentAnEmail";
}
<h2>SendStudentAnEmail</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>EmailViewModel</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Email)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Email)
@Html.ValidationMessageFor(model => model.Email)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Subject)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Subject)
@Html.ValidationMessageFor(model => model.Subject)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Body)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Body)
@Html.ValidationMessageFor(model => model.Body)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
谢谢。
的 的 * UPDATE *
如果我将HttpPost Action更改为使用FormCollection,我可以正常使用这些值,我甚至可以将FormCollection值重新转换回我的EmailViewModel。这是为什么?
[HttpPost]
public ActionResult SendStudentAnEmail(FormCollection emailFormCollection)
{
Debug.Write(emailFormCollection["email"]);
Debug.Write(emailFormCollection["subject"]);
Debug.Write(emailFormCollection["body"]);
var email = new EmailViewModel
{
Email = emailFormCollection["email"],
Subject = emailFormCollection["subject"],
Body = emailFormCollection["body"]
};
. . . . then the rest of my code works just how I wanted. . .
为什么我必须从FormCollection转换到我的EmailViewModel?如果我试图简单地将EmailViewModel推送到我的Action中,为什么它不会给我NullReference异常?
答案 0 :(得分:2)
您的EmailViewModel
类有一个名为Email
的属性,类型为字符串。并且您的控制器操作采用名为email
的{{1}}类型的参数。这会混淆默认的模型绑定器。因此,要么重命名视图模型中的属性,要么重命名操作参数:
EmailViewModel