2012-04-18 107 views
2

有一些問題試圖建模綁定到我的視圖模型。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是這裏的罪魁禍首嗎?

+0

您能否顯示您發佈此表單的行爲的確切簽名? – 2012-04-18 15:09:17

+0

1 - 我假設你正在發回'RegistrationVM'? 2 - 另外,爲什麼當用戶沒有任何要編輯的東西時,你使用EditorTemplate? DisplayTemplate將是更合適的選擇。 3 - 如果你的操作方法是一個'UserDetailsVM'的另一個參數,它是否正確綁定?我想你會需要你的'yourVariable.UserDetails.EmailAddress'來正確綁定。 – Tejs 2012-04-18 15:09:50

+0

我懷疑問題在於你沒有發佈的東西。我沒有看到你在做什麼錯。 – 2012-04-18 15:10:21

回答

0

快速背景檢查:這是在創建「嚮導」逐步註冊過程時遇到的問題。我想避免將信息保存到數據庫,直到註冊完成。因此,這個想法是使用TempData集合在Actions之間存儲信息,並使用RedirectToAction逐步移動。

對於什麼是值得的,我使用像這樣

[HttpGet] 
public ActionResult Travel(PreRegistrationVM model) 
{ 
    if (TempData["PreRegistrationVM"] != null) 
    { 
     model = (PreRegistrationVM)TempData["PreRegistrationVM"]; 
    } 
    var newModel = new RegistrationVM(model); 
    return View(newModel); 
} 

TempData的檢索每在登記過程中的步驟,一旦數據庫中的信息修改的方法。

[HttpGet] 
public ActionResult Travel(int id) 
{ 
    var model = FooRepository.GetById(id); 
    return View(model); 
} 

我不完全確定爲什麼TempData方法導致這種情況,會對比我提供理由的人更感興趣。

非常感謝所有回答,幫我追蹤下來。