0

ネストされた HomeAddress および MailAddress モデルを呼び出すメインの RegisterModel があります。

public class RegisterModel
{
   Public string FirstName {get; set;}
   Public string LastName  {get; set;}
   Public HomeAddressModel homeAddress {get; set;}
   Public MailAddressModel mailAddress {get; set;}
}

public class HomeAddressModel
{
    Public string Street1 {get; set;}
    Public string Street2  {get; set;}
    Public string State {get; set;}
    Public string City {get; set;}
}

public class MailAddressModel
{
    Public string Street1 {get; set;}
    Public string Street2  {get; set;}
    Public string State {get; set;}
    Public string City {get; set;}
}

住所の部分ビュー

@model MyNamespace.Models.???
@{
    Layout = "~/Views/_Layout.cshtml";
}
 <div id="Address">
   //Street1
   //Street2
   //State
   //City
 </div>

実行時に HomeAddressModel または MailAddressModel のいずれかとバインドできるように、Parital ビューを定義する方法を教えてください。

私のメインの登録ビュー

@model MyNamespace.Models.RegisterModel
@{
     Layout = "~/Views/_Layout.cshtml";
 }
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "myForm" }))
{
  <div id="form">
    @Html.TextBoxFor("FirstName");
    @Html.TextBoxFor("LastName");
   //Render Partial View for HomeAddress.
   //Will provide a checkbox if Mailing Address is different.
   //Render Partial View for MailAddress.
  </div>
}

public ActionResult Register()
{  
    var model = new RegsiterModel();
    return View(model);
}

[HttpPost]
public ActionResult Register(RegisterModel model, 
                            HomeAddressModel  homeAddress, 
                            MailAddressModel mailingAddress)
{
       //Do Something with different Addresses
       return View();
}

この質問には 5 つの部分があります: -

  1. RegisterModel クラスは正しく作成されていますか? これは、それらをネストできる方法ですか?
  2. Address に対して単一のクラスを使用し、両方の Addresses に対して 2 つの異なるプロパティを使用する必要がありますか? Address home {get;set;} と Address mail{get;set;} のようなもの。はいの場合、次のことを達成する方法。
  3. Address の部分ビューを作成するには? 別の HomeAddres クラスと MailAddress クラスを使用している両方のシナリオで。または、単一の Address クラスを使用します。
  4. 上記の両方のアプローチで Main Register View で partialView を宣言する方法。
  5. [HttpPost] アクション メソッドですべての値を読み取れるようにする方法、つまり RegisterModel 値がバインドされ、個々のアドレスもバインドされます。
4

1 に答える 1

1

次のような住所の単一のモデルを用意する

public class AddressModel
{
    Public string Street1 {get; set;}
    Public string Street2  {get; set;}
    Public string State {get; set;}
    Public string City {get; set;}
}

Views/Shared/EditorTemplates/AddressModel.cshtml で部分ビューを作成します。

@model MyNamespace.Models.AddressModel
<div id="Address">
   Html.TextBoxFor(m => m.Street1)
   //Street2
   //State
   //City
</div>

ビューモデルがある場合

public class RegisterModel
{
   Public string FirstName {get; set;}
   Public string LastName  {get; set;}
   Public AddressModel HomeAddress {get; set;}
   Public AddressModel MailAddress {get; set;}
}

このように各住所の部分ビューをレンダリングするだけです

<div id="form">
    @Html.TextBoxFor(m => m.FirstName);
    @Html.TextBoxFor(m => m.LastName);
    @Html.EditorFor(m => m.HomeAddress) // !! -> this will render AdressModel.cshtml as a partial view, and will pass HomeAdress to it
   //Will provide a checkbox if Mailing Address is different.
    @Html.EditorFor(m => m.MailAddress)
</div>

さらにロジックが必要な場合は、必要に応じて、EditorFor の呼び出しを独自のヘルパー メソッドにラップできます (ビューの追加パラメーターなど)。

HttpPost メソッドでは、これを使用します

[HttpPost]
public ActionResult Register(RegisterModel model)
{
}

アドレスは RegisterModel のプロパティにバインドされます。

于 2013-05-06T17:04:16.990 に答える