2011-04-21 32 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) 
{ 
    ... 
}