2011-12-21 75 views
7

我很好奇在表單中使用多個強類型部分的方法是否回到部分包含View是正確的MVC方法來處理。主視圖綁定與略去了一些其他的屬性和數據註解以下模型:MVC 3 Razor Form Post帶有多個強類型部分視圖無法綁定

public class AccountSetup : ViewModelBase 
{ 
    public bool TermsAccepted { get; set; } 
    public UserLogin UserLogin { get; set; } 
    public SecurityQuestions SecurityQuestions { get; set; } 
} 

public class UserLogin 
{ 
    public string LoginId { get; set; } 
    public string Password { get; set; } 
} 

主要Register.cshtml觀的標記是不完全的下方,但是這是諧音是如何使用如下:

@model Models.Account.AccountSetup 

. . . <pretty markup> . . . 

@using (Html.BeginForm("Register", "Account", FormMethod.Post)) 
{ 
    . . . <other fields and pretty markup> . . . 

    @Html.Partial("_LoginAccount", Model.UserLogin) 
    @Html.Partial("_SecurityQuestions", Model.SecurityQuestions) 

    <input id="btnContinue" type="image" /> 
} 

僅供參考,_LoginAccount的部分視圖在下面,刪除了多餘的標記。

@model Models.Account.UserLogin 

<div> 
    @Html.TextBoxFor(mod => mod.LoginId) 

    @Html.PasswordFor(mod => mod.Password) 
</div> 

問題是在表單發佈到註冊AccountSetup屬性是null包含在部分中。但是,如果我將各個模型添加到方法簽名中,它們會被填充。我意識到這是因爲當字段呈現ID被更改時,它們看起來像RegisterLog View的_LoginId,因此它不會映射回AccountSetup模型。

沒有得到值回accountSetup.UserLogin或accountSetup.SecurityQuestions

[HttpPost] 
    public ActionResult Register(AccountSetup accountSetup) 
    { 

獲取值回USERLOGIN和securityQuestions

[HttpPost] 
    public ActionResult Register(AccountSetup accountSetup, UserLogin userLogin, SecurityQuestions securityQuestions) 
    { 

現在的問題是如何一回這些映射到包含Views(AccountSetup)模型的屬性,而不必爲了獲取值而將局部模型添加到方法簽名?這是在主視圖中使用強類型局部視圖的不好方法嗎?

回答

0

這是因爲您的部分視圖是強類型的。在局部模板移除@model聲明,像這樣訪問

@Html.Partial("_LoginAccount") 

模型屬性,然後在局部

<div> 
    @Html.TextBoxFor(mod => mod.UserLogin.LoginId) 
    @Html.PasswordFor(mod => mod.UserLogin.Password) 
</div> 
+0

如果有的話我會覺得做類似下面會比建議的更改一個更好的方法: @ Html.TextBoxFor(MOD => mod.LoginId,新{ID =「UserLogin_LoginId」}) 如果我一樣建議我最終將該部分特定於主視圖的強類型模型屬性。如果我有另一個想要使用相同部分的視圖,但是UserLogin屬性簡單地命名爲LoginCredentials?然後,我回過頭來看,我的主要觀點只是把標記放回原處,因爲它不能解決我原來的問題。 – Coderrob 2011-12-23 03:11:39

+0

您是否找到解決此問題的方法? – Buzzer 2012-05-15 20:48:50

0

所有的諧音意見應與同一視圖模型是強類型(AccountSetup在情況下):

@model Models.Account.AccountSetup 

@Html.TextBoxFor(mod => mod.UserLogin.LoginId) 
@Html.PasswordFor(mod => mod.UserLogin.Password) 

然後:

@Html.Partial("_LoginAccount", Model) 
相關問題