2009-07-10 56 views
3

我在ASP.NET MVC頁面中有兩個Address.ascx控件實例。如何在ASP.NET MVC的同一頁中使用兩個相同的.ascx實例?

<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項目陣列,但我想知道是否有一個稍微優雅的解決方案。

PS。我確信之前已經有很多次提到過這個問題,但我似乎無法提供正確的搜索條件。請鏈接這個問題,如果你知道愚蠢!

回答

3

你可以有一個視圖模型

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

formelements的值映射到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)的名稱。

然後形式元素以這種形式

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

定義的ASCX的地方看起來少見。任何你不把它放在共享和訪問的原因

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

+0

謝謝。這看起來迄今爲止是最乾淨的解決方案。我還沒有意識到模型綁定器是這個聰明的:-)並且就.ascx位置而言,我正在現有應用程序中編寫一個購物車,並且希望儘可能地保持購物車控件的獨立性。 – 2009-07-11 18:49:42

4

首先,向該模型添加一個地址類。

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,你需要在頂部的行繼承了地址模式,就像這樣:

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


控制器主視圖 ,將你的兩個地址推入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(); 


在你主視圖,打電話給你的兩個地址子視圖這樣的:

<%= Html.RenderPartial("Address", ViewData["Address1"]) %> 
<%= Html.RenderPartial("Address", ViewData["Address2"]) %> 
相關問題