2010-09-14 126 views
0

我甚至不確定從哪裏開始解釋這個問題。在過去的10個小時裏,我一直在努力解決這個問題,而不知道根本原因。如果需要任何額外的細節,我很樂意提供。我只是猜測在這一點上什麼是相關的。Asp.net MVC2 ModelBindingContext.ModelName empty

我有一個MVC2網站與由史蒂夫Hodgkiss'精彩RestfulRouting包設立路由,使用默認的路徑設定具有嵌套控制器(例如/客戶/ {的CustID} /位置/ {LOCID}和這樣)。

在這裏,我有一個特定的模型,給我的問題。出於某種原因,當創建頁面發佈數據返回到我的服務器時,ModelBindingContext對象中的ModelName屬性傳遞給DefaultModelBinder(以及我的自定義類繼承自DefaultModelBinder,以處理從存儲庫中抓取對象)。這隻發生在這一個模型上。我根本無法發現差異。

破碎模型

public class RemedialItem : Entity 
{ 
    public virtual int Id { get; set; } 
.... 

的工作模式:

public class Customer : Entity 
{ 
    public virtual int Id { get; set; } 
.... 

實體是用作反射使用的標記只是一個空類。

RemedialItemController.cs

[HttpGet] 
public ActionResult New(int? locationId, int? applianceId) 
{ 
    var model = ViewModelFactory.Create<CreateRemedialItemViewModel>(); 
    model.Categories = (from c in repository.Query<RemedialItemCategory>() 
         orderby c.Name 
         select c).ToList(); 
    model.RemedialItem = new RemedialItem(); 
    return View(model); 
} 

的工作的控制器方法破碎的控制器方法在CustomerController.cs

[HttpGet] 
    public ActionResult New() 
    { 
    var viewModel = ViewModelFactory.Create<SingleCustomerViewModel>(); 
    viewModel.Customer = new Customer(); 

    return View(viewModel); 
    } 

ViewModelFactory是注入的類來處理建立通用於所有視圖模型一些基本性質(主要是用戶登錄和用戶詳細信息)

破碎的viewmodel:

public class CreateRemedialItemViewModel : ViewModelBase 
{ 
    public RemedialItem RemedialItem { get; set; } 
    public IList<Location> Locations { get; set; } 
    public IList<Appliance> Appliances { get; set; } 
    public IList<RemedialItemCategory> Categories { get; set; } 
} 

的工作視圖模型:

public class SingleCustomerViewModel : ViewModelBase 
{ 
    public Customer Customer { get; set; } 
} 

ViewModelBase包含由ViewModelFactory填充性能屈指可數。

破碎的形式thew新視圖RemedialItem:

<% using(Html.BeginForm("Create","RemedialItem",FormMethod.Post)) 
{%> 
<%: Html.AntiForgeryToken() %> 
<fieldset>  
    <legend>General</legend>  
    <div> 
     <%: Html.LabelFor(m=>m.RemedialItem.Category) %> 
     <%:Html.DropDownListFor(m=>m.RemedialItem.Category.Id, new SelectList(Model.Categories,"Id","Name")) %> 
    </div> 
    <div> 
     <%: Html.LabelFor(m=>m.RemedialItem.Item) %> 
     <%: Html.TextAreaFor(m=>m.RemedialItem.Item) %> 
    </div> 
    <div> 
     <%: Html.LabelFor(m=>m.RemedialItem.Note) %> 
     <%: Html.TextAreaFor(m=>m.RemedialItem.Note) %> 
    </div> 
    <input type="submit" value="Create Item" /> 
</fieldset> 
<%}%> 

的工作新觀點:

<% using (Html.BeginForm("Create","Customer",FormMethod.Post)) {%> 
    <%: Html.ValidationSummary(true) %> 
    <%:Html.AntiForgeryToken() %> 
    <fieldset> 
     <legend>Fields</legend> 
     <p> 
     <%: Html.LabelFor(m=>m.Customer.Name) %> 
     <%: Html.TextBoxFor(m=>m.Customer.Name) %> 
     </p> 
     <p> 
     <%: Html.LabelFor(m=>m.Customer.Street) %> 
     <%: Html.TextBoxFor(m=>m.Customer.Street) %> 
     </p> 
     [...tl;dr...] 
     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 

<% } %> 

兩者產生類似的字段名稱:

破碎:

<label for="RemedialItem_Item">Item</label> 
<textarea cols="20" id="RemedialItem_Item" name="RemedialItem.Item" rows="2"> 
</textarea> 

Worki NG:

<label for="Customer_Name">Name</label> 
<input id="Customer_Name" name="Customer.Name" type="text" value="" /> 

我對過長的代碼轉儲道歉,簡稱: 工作集的東西,當回發的創建形式,有MODELNAME設置爲Customer。破碎的東西是一個空字符串

有什麼我失蹤了嗎?有沒有人遇到過這樣的事情?

回答

0

我發現了這個問題。在ViewModel中,保存要顯示的實例RemedialItem的屬性稱爲RemedialItem。在發佈到的操作中,採用RemedialItem實例的參數被稱爲item,這打破了一切。

簡而言之,在使用ViewModels時,請確保從ViewModel獲取對象的參數名稱與viewmodel中的屬性名稱相同。

去了我的一天。