2012-01-31 34 views
5

我定義一個變量作爲ASP.MVC3 ModelState.IsValid不包括RemoteAttribute檢查

public class EditModel 
{ 
    [Remote("IsNameAvailable", "Home", ErrorMessage = "Name is in use.")] 
    [Display(Name = "Name")] 
    public string Name{ get; set; } 
} 

,並在家庭控制器

public JsonResult IsNameAvailable(string name) 
{ 
    if (duplicate) 
     return Json(false, JsonRequestBehavior.AllowGet); 
    else 
     return Json(true, JsonRequestBehavior.AllowGet); 
} 

,但是當我檢查ModelState.IsValid中的保存動作,即使我可以看到顯示在視圖上的錯誤消息,它總是返回true。

public ActionResult Save(EditModel editModel) 
{ 
    if (!ModelState.IsValid) 
    { 
     //Return to view and display error in view 
     return View("Home", editModel); 
    } 

    //Input data is valid and save record 
    Repository.Save(editModel.Name); 
} 

[問題]
如何能在ModelState中檢查也是一個模型由RemoteAttribure的驗證規則?

回答

2

你有兩個選擇。您可以實現IDataErrorInfo或IValidatableObject接口並在那裏重新進行驗證。這些接口由MVC開箱即用,並且您的ModelState將反映這一點。

您的其他選項是創建自己的屬性,該屬性源自RemoteAttribute。在此自定義屬性中,添加應用相同驗證服務器端的邏輯。

最後一個選擇是我會去的那個,但那會花費更多的時間。 This question應該幫助你。

+0

謝謝你的建議!這種情況是,我有很多這樣的模型,我想找到減少代碼的最佳選擇。需要編碼的第一個和第二個選項取決於使用遠程屬性的模型編號。你能解釋更多最後的選擇嗎? – daniel 2012-02-01 02:37:32

+2

RemoteAttribute的IsValid方法實際上被稱爲serverside。如果您使用.NET反編譯器查看此方法,您會看到所有此方法所做的都是「返回true」。創建自己的屬性,該屬性派生自RemoteAttribute,並在該IsValid()方法中放置一些實際的驗證邏輯。例如,你可以在你自己的屬性上創建一個額外的屬性,比如ValidationMethod。使用該屬性時,可以傳遞應該執行驗證的方法。在您的IsValid()方法中,您可以調用該驗證方法。 – 2012-02-06 10:57:43