有人可以解释为什么模型对象为null。我检查了电汇上的帖子值,并且所有这些值都已填充。
使用VS2010 Beta 2,WinXp SP2,但这适用于VS2008 ?? !!
死亡讯息的黄色屏幕
>'/'应用程序中的服务器错误。 你调用的对象是空的。 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中的起源位置的更多信息。异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。
来源错误:
Line 17: <p> Line 18: <label for="id">id:</label> Line 19: <%= Html.TextBox("id", Model.id) %> <--Error Line 20: <%= Html.ValidationMessage("id", "*") %> Line 21: </p>
控制器代码
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Contact contactToEdit)
{
if (contactToEdit.FirstName.Trim().Length == 0)
ModelState.AddModelError("FirstName", "First name is required.");
if (contactToEdit.Lastname.Trim().Length == 0)
ModelState.AddModelError("LastName", "Last name is required.");
if (contactToEdit.Phone.Length > 0 && !Regex.IsMatch(contactToEdit.Phone, @"((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}"))
ModelState.AddModelError("Phone", "Invalid phone number.");
if (contactToEdit.Email.Length > 0 && !Regex.IsMatch(contactToEdit.Email, @"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$"))
ModelState.AddModelError("Email", "Invalid email address.");
if (!ModelState.IsValid)
return View();
try
{
// TODO: Add update logic here
var con = (from c in _entities.Contacts
where c.id == contactToEdit.id
select c).FirstOrDefault();
_entities.ApplyCurrentValues(con.EntityKey.EntitySetName, contactToEdit);
_entities.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
观看代码段
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<JQGallery.Models.Contact>" %>
...
<%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>
<% using (Html.BeginForm()) {%>
<fieldset>
<legend>Fields</legend>
<p>
<label for="id">id:</label>
<%= Html.TextBox("id", Model.id) %>
<%= Html.ValidationMessage("id", "*") %>
</p>
<p>
<label for="FirstName">FirstName:</label>
<%= Html.TextBox("FirstName", Model.FirstName) %>
<%= Html.ValidationMessage("FirstName", "*") %>
</p>
<p>
...
答案 0 :(得分:0)
您是否有接受非发布动词的控制器操作并为您的视图设置模型?如果直接导航到视图而没有响应GET请求并填充模型的Action方法,则模型将为null。
例如,您的常规操作可能类似于
//
// Reponds to: GET /Contact/Edit/5
public ActionResult Edit(int id)
{
Contact contactToEdit = GetContactFromDatabase(id);
return View(contactToEdit);
}
我看不到POST操作有什么问题,但您确实需要相应的GET操作来为您设置表单。
编辑:您可能要考虑的另一件事是,因为您使用的是ASP.NET MVC内置模型绑定器,您可能应该排除ID(或者用户在逻辑上无法理解的任何敏感字段)改变)实际上从表格中删除它(或至少使其不可编辑)。您可以使用传入联系人对象上的属性执行此操作,如下所示://
// Reponds to: POST /Contact/Edit/5
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit([Bind(Exclude="id")] Contact contactToEdit)
{
// ... do edit logic/validation stuff
}
答案 1 :(得分:0)
Model对象为null,因为您没有设置它。在POST控制器方法中,您返回的查看结果都没有设置模型(在if (!ModelState.IsValid)
行之后和catch
块中)。在这两种情况下,您需要从某个位置重新加载模型,以便视图可以重新显示其数据。