2011-12-21 5 views
7

Viewを含む部分に複数の強く型付けされた部分的な部分を使用するアプローチが、作業を行うための正しいMVCのアプローチであるかどうか不思議です。メインRegister.cshtmlビューのマークアップが完全に下にはありませんが、これはパーシャルが使用されている方法ですMVC 3面取りフォーム複数の強く型付けされた部分ビューがバインドされていない

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; } 
} 

:メインビューを簡潔にするため省略し、他のいくつかのプロパティとデータの注釈では、次のモデルにバインドされています次のようになります。

参考のために、_LoginAccountの部分図は以下のとおりです。余分なマークアップは削除されています。

@model Models.Account.UserLogin 

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

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

問題は、AccountSetupプロパティを登録するためのポストにあり、部分的に含まれています。しかし、個々のモデルをメソッドのシグネチャに追加すると、それらはいっぱいになります。フィールドが表示されるとIDが変更され、RegisterViewの_LoginIdのように見えるので、AccountSetupモデルにマップされないためです。

はaccountSetup.UserLoginのために戻って値を取得しませんかaccountSetup.SecurityQuestions

[HttpPost] 
    public ActionResult Register(AccountSetup accountSetup) 
    { 

はuserloginのために戻って値を取得し、securityQuestions

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

の質問はどのように1がに戻ってこれらをマッピングしませんさビュー(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

+0

これを解決する方法を見つけましたか? – Buzzer

0

にすべてのパーシャルビューは強くあなたの中に同じビューモデル(AccountSetupで入力する必要がありますケース):次に

@model Models.Account.AccountSetup 

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

@Html.Partial("_LoginAccount", Model) 
関連する問題