我甚至不確定從哪裏開始解釋這個問題。在過去的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
。破碎的東西是一個空字符串
有什麼我失蹤了嗎?有沒有人遇到過這樣的事情?