错误在ASP.NET MVC中发布编辑数据

时间:2009-12-31 14:41:17

标签: asp.net-mvc

有人可以解释为什么模型对象为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>
        ...

2 个答案:

答案 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块中)。在这两种情况下,您需要从某个位置重新加载模型,以便视图可以重新显示其数据。