2009-07-10 21 views
3

私はASP.NET MVCページにAddress.ascxコントロールの2つのインスタンスを持っています。ASP.NET MVCの同じページで同じ.ascxの2つのインスタンスを使用するにはどうすればよいですか?

<h1>Shipping Address</h1> 
    <% Html.RenderPartial("Controls/AddressControl"); %> 

    <h1>Billing Address</h1> 
    <% Html.RenderPartial("Controls/AddressControl"); %> 

もちろん、これとまったく同じコードでは、アドレスの各フィールドに同じIDが割り当てられます。フィールドのIDに文字列を簡単に追加できるので、'Street1_billing''Street1_shipping'がありますが、これをモデルにマップする方法がわかりません。

モデルをアイテムの配列(この場合は2つ)にマッピングする最適な解決策は何ですか? 私はこのためのASP.NETの「すぐに使える」ソリューションを認識していません。

注:これはthis questionと少し似ていますが、this solution from Scott Hanselmanを使用することもできますが、正確には私が望むものではありません。私の場合、私は2つの項目を持っていることを知っています。したがって、本質的に2項目の配列ですが、もう少し洗練されたソリューションがあるのだろうかと思います。

PS。私はこれまでに何度も尋ねられてきたと確信していますが、私はちょうど正しい検索語を置くことはできません。あなたが詐欺師を知っているなら、この質問にリンクしてください!

答えて

3

をあなたがFormElementsとの値がマップされているのViewModel

OrderCheckoutViewModel 
{ 
    public Address ShippingAddress{get;set;} 
    public Address BillingAddress{get;set;} 
} 

を持つことができますViewModelの右のメンバーは、フォームが

の場合
<input type="text" name="ShippingAddress.StreetAddress1"><input> 

StreetAddress1からShippingAddress.StreetAddress1に移動するのは簡単でエレガントな方法はありません。 マイアドレスモデルの形式は次のとおりです。

public class Address 
{ 
    String StreetAddress1 { get; set } 
    String StreetAddress2 { get; set } 
    String City { get; set } 
    String State { get; set } 
    String Zip { get; set } 
    String InstanceName{ get; set } 
} 

私は財産(のShippingAddress)の名前をInstanceNameに設定します。

そして、フォーム要素が

<input type="text" name="<%=Model.InstanceName%>.StreetAddress1"><input> 

この形式で定義されているascxファイルの場所は珍しい見えます。あなたがSharedに入れてアクセスしない理由は何ですか?

<% Html.RenderPartial("AddressControl",Model.ShippingAddress); %> 

+0

ありがとうございます。これはこれまでのところ最もクリーンなソリューションに見えます。私はmodelbinderがこの巧妙であることを認識していませんでした:-)そして.ascxの場所に関する限り、私は既存のアプリケーションにショッピングカートを書いています。 –

+0

その男は確かに賢いです。私がまだ見ていないことの1つは、同じ種類の構文でルートから値をマップできるかどうかです。 –

4

最初にアドレスクラスをモデルに追加します。メインビューためコントローラで

<%@ Page Language="C#" 
    Inherits="System.Web.Mvc.ViewPage<MyProject.Models.Address>" %> 


public class Address 
{ 
    String StreetAddress1 { get; set } 
    String StreetAddress2 { get; set } 
    String City { get; set } 
    String State { get; set } 
    String Zip { get; set } 
} 


Address.ascx
では、このようなアドレスモデルを継承上部のラインを必要とします2つのアドレスをViewDataにプッシュします。あなたのメインビュー

Address myAddressObject1 = new Address 
{ 
    AddressLine1 = "123 Anywhere Street", 
    // ..etc. Same with MyAddressObject2. Or, just populate from database. 
} 

ViewData["Address1"] = myAddressObject1; 
ViewData["Address2"] = myAddressObject2; 
// 
// do other stuff as needed 
// 
Return View(); 


、このようなあなたの2つのアドレスのサブビューを呼び出す:

<%= Html.RenderPartial("Address", ViewData["Address1"]) %> 
<%= Html.RenderPartial("Address", ViewData["Address2"]) %> 
関連する問題