3

Address.ascx我在 ASP.NET MVC 页面中有两个控件实例。

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

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

当然,使用与此完全相同的代码,我最终会为地址中的每个字段提供相同的 ID。我可以很容易地将一个字符串附加到字段的 ID 中,所以我有'Street1_billing'and 'Street1_shipping',但我不清楚如何将它映射到模型。

将模型映射到项目数组的最佳解决方案是什么(在这种情况下只有 2 个)。我不知道有任何 ASP.NET 的“开箱即用”解决方案。

注意:这与这个问题有点相似,我可以使用Scott Hanselman 的这个解决方案,但这并不是我想要的。就我而言,我知道我有两个项目,所以它本质上是一个 2 项目数组,但我想知道是否有更优雅的解决方案。

PS。我敢肯定这已经被问过很多次了,但我似乎无法输入正确的搜索词。如果您知道受骗,请链接此问题!

4

2 回答 2

4

首先,在模型中添加一个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中,您需要在顶部有一行继承 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"]) %>
于 2009-07-10T04:46:32.500 回答
3

你可以有一个 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 }
}

我将 InstanceName 设置为属性的名称 (ShippingAddress)。

然后在这个表单中定义表单元素

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

ascx 的位置看起来不常见。您为什么不将其放入 Shared 并通过以下方式访问它的任何原因

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

?

于 2009-07-11T16:53:23.373 回答