我在ASP.NET MVC页面中有两个Address.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。我确信之前已经多次询问过,但我似乎无法用正确的搜索词来表达。如果你知道欺骗,请链接这个问题!
答案 0 :(得分: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 中,您需要在顶部继承Address模型的行,如下所示:
<%@ 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"]) %>
答案 1 :(得分:3)
您可以拥有ViewModel
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 }
}
我将InstanceName设置为属性的名称(ShippingAddress)。
然后以这种形式定义表单元素
<input type="text" name="<%=Model.InstanceName%>.StreetAddress1"><input>
ascx的地方看起来并不常见。您之所以没有将其置于共享并通过
访问它的原因<% Html.RenderPartial("AddressControl",Model.ShippingAddress); %>