2009-12-31 36 views
0

有人可以解釋爲什麼模型對象爲null。我檢查了通過網絡發佈的帖子值,並且它們都被填充。錯誤發佈ASP.NET MVC中的編輯數據

使用VS2010 Beta 2,WinXp SP2,但是這在VS2008中工作??!

死亡消息的黃屏

Server Error in '/' Application. Object reference not set to an instance of an object. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:

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-\.][email protected]([\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

Model對象爲空,因爲您沒有設置它。在您的POST控制器方法中,您返回的查看結果都不會設置模型(在if (!ModelState.IsValid)行之後並在catch塊中)。在這兩種情況下,您需要從某處重新加載模型,以便視圖可以重新顯示其數據。

+0

實際上,這不是真的,因爲模型綁定。點擊此處查看更多信息:http://www.asp.net/learn/mvc/tutorial-36-cs.aspx –

+0

模型綁定使用提交的表單值在OP的Edit方法中實例化和設置contactToEdit參數的屬性。它沒有實例化和填充可用於其View的Model對象。 (您教程中的示例鏈接僅使用View()方法工作,因爲該特定示例視圖不會嘗試訪問Model對象。) –

+0

實際上,我向您發送了一個鏈接,僅指向「創建」操作,但編輯將工作於同樣的方式:http://www.asp.net/%28S%28pdfrohu0ajmwt445fanvj2r3%29%29/learn/mvc/tutorial-28-cs.aspx - 這個想法是因爲模型POST'ed到行動,當動作簡單地返回到視圖時,模型綁定會將其推回到瀏覽器。 –

0

你有接受非員額動詞和臺控制器動作爲你的觀點提供模型?如果您沒有響應GET請求並填充模型的Action方法直接導航到視圖,模型將爲空。

例如,你的正常操作可能是像

// 
// 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 
} 
+0

我確實有一個GET操作,它帶有標準的生成視圖。 – D0cNet

+0

爲什麼它會在VS2008中工作? – D0cNet