2011-04-21 30 views
2

我的问题是相似的:远程验证失败时诠释复杂类型

Compound View Model object causing remote validation failure

我的模型:

public class Address 
{ 
    public string Street { get; set; } 
    public string City { get; set; } 
    [Remote("CheckZip", "Validation")] 
    public string PostalCode { get; set; } 
    public string Country { get; set; } 
} 

public class OrderViewModel 
{ 
    public Address ShippingAddress { get; set; } 
    public Address BillingAddress { get; set; } 
    public string OrderItem { get; set; } 
    public string OrderQuantity { get; set; } 
} 

渲染HTML创建领域ShippingAddress_Postalcode和BillingAddess_PostalCode。

的CheckZip行动:

public ActionResult CheckZip (string PostalCode) 
{ 
    ... 
} 

这当然不行,因为不被发送POSTALCODE代替其任ShippingAddress_Postalcode或BillingAddess_PostalCode。我如何使用相同的CheckZip操作来处理多个属性中存在的相同子属性?

回答

1

CheckZip应该接收一个地址而不是一个字符串,然后检查该地址的邮政编码属性。

public ActionResult CheckZip (Address addressToCheck){ ...} 
+0

我将如何标记HTML并CheckZip采取的地址?或者使用绑定属性在控制器上完成工作?我现在的看法如下所示:<%= Html.TextBoxFor(model => model.ShippingAddress.PostalCode)%> – 2011-04-21 20:07:13

+0

该工作应该在控制器中完成。如果您正确命名参数,则可以避免使用绑定属性。在远程验证触发时,我会查看返回的查询字符串,这为您提供了一个很好的线索,说明如何构建您的方法,以便它能够正确绑定。 – 2011-04-21 21:58:07

+0

似乎有CheckZip采取地址会产生相同的问题,因为查询字符串仍将发送不同的名称(ShippingAddress或BillingAddress)到CheckZip。 Bind属性具有Prefix参数,该参数为查询字符串名称添加前缀。我需要一些删除前缀的方式才能重用CheckZip操作。 – 2011-04-22 13:54:01

1

你可以尝试如下: 在控制器中,添加两个方法,

[ActionName("CheckZip")] 
public ActionResult CheckZip (Address ShippingAddress) 
{ 
    ... 
} 

[ActionName("CheckZip")] 
public ActionResult CheckZip1 (Address BillingAddress) 
{ 
    ... 
}