有一些問題試圖建模綁定到我的視圖模型。MVC3模型綁定問題與EditorTemplates
基本視圖模型是這樣的:
public class RegistrationVM
{
public TravelHistoryVM TravelHistory {get;set;}
public UserDetailVM UserDetails {get;set;}
public ICollection<HandsetDevicesVM> ExistingDevices {get;set;}
}
一種用於圖3周進一步的ViewModels包裝,每個包含的字符串,整數和布爾變量通常的頻帶。暫時忽略HandsetDevicesVM的集合。
我有以下視圖(樣品爲清楚起見)
@using (Html.BeginForm())
{
@Html.ValidationSummary(false)
@Html.LabelFor(model => model.TravelHistory.DoNotTravel)
@Html.CheckBoxFor(model => model.TravelHistory.DoNotTravel)
@Html.EditorFor(model => model.UserDetails, "UserDetailsHidden")
}
在「TravelHistory」對象被綁定細,沒有問題。 當UserDetails數據回傳時,UserDetails對象始終爲空。
模板絕對是渲染,我可以從HTML中知道。模板本身如下:
@model Foo.Bar.UserDetailVM
@Html.HiddenFor(model => model.EmailAddress)
@Html.HiddenFor(model => model.FirstName)
@Html.HiddenFor(model => model.Surname)
@* etc etc *@
的HTML生成是
<input data-val="true" data-val-required="The Email Address field is required." id="UserDetails_EmailAddress" name="UserDetails.EmailAddress" type="hidden" value="[email protected]" />
<input data-val="true" data-val-required="The First Name field is required." id="UserDetails_FirstName" name="UserDetails.FirstName" type="hidden" value="Stack" />
<input data-val="true" data-val-required="The Surname field is required." id="UserDetails_Surname" name="UserDetails.Surname" type="hidden" value="Overflow" />
我使用上沒有問題(其綁定到視圖模型沒有問題的)另一種觀點認爲這EditorTemplate。
最後,使用招我能夠確定該信息被張貼..我認爲
UserDetails.EmailAddress=stack%40overflow.com.test&UserDetails.FirstName=stack&UserDetails.Surname=overflow
任何想法?我應該在哪裏集中我的調試工作?
EDIT1:剛剛發現這起的ModelState對象
AttemptedValue: 'Foo.Bar.UserDetailVM'
所以看起來它試圖將字符串值「Foo.Bar.UserDetailVM」的對象綁定和(顯然)失敗。
EDIT2:
[HttpPost]
public ActionResult Travel(RegistrationVM model)
按照要求,行動我張貼到
EDIT3:
唉唉.. OK回到舞臺,這是提供了操作方法的查看
[HttpGet]
public ActionResult Travel(PreRegistrationVM model)
{
if (TempData["PreRegistrationVM"] != null)
{
model = (PreRegistrationVM)TempData["PreRegistrationVM"];
}
var newModel = new RegistrationVM(model);
return View(newModel);
}
這就是我一直在使用的(因此一直是過程的一部分t不起作用)。基本上來自前一步驟的信息保存在TempData中並以此方法提取。然後它被用來像上面那樣實例化VM。此時(如果我在此處插入斷點),模型將按照我的預期填充數據。
如果我修改那個以下:
[HttpGet]
public ActionResult Travel(PreRegistrationVM model)
{
var newModel = new RegistrationVM
{
FirstName = "Stack",
Surname = "Overflow"
};
return View(newModel);
}
它結合預期。 TempData是這裏的罪魁禍首嗎?
您能否顯示您發佈此表單的行爲的確切簽名? – 2012-04-18 15:09:17
1 - 我假設你正在發回'RegistrationVM'? 2 - 另外,爲什麼當用戶沒有任何要編輯的東西時,你使用EditorTemplate? DisplayTemplate將是更合適的選擇。 3 - 如果你的操作方法是一個'UserDetailsVM'的另一個參數,它是否正確綁定?我想你會需要你的'yourVariable.UserDetails.EmailAddress'來正確綁定。 – Tejs 2012-04-18 15:09:50
我懷疑問題在於你沒有發佈的東西。我沒有看到你在做什麼錯。 – 2012-04-18 15:10:21