當您使用IValidatableObject驗證模型屬性時,表單將被張貼。作爲Joeri JANS說,你仍然可以防止這種情況,你的操作方法在返回頁面給用戶:
public ActionResult MyAction(MyModel model)
{
if (ModelState.IsValid)
{
// code to perform action when input is valid
return [return something]
}
return View(model); // re-display form because ModelState.IsValid == false
}
如果您希望自定義驗證,以防止被貼在表格,你需要驗證客戶端。最簡單的方法是使用RemoteAttribute。
public class MyModel
{
[Remote("MyValidateAction", "MyController", HttpMethod = "POST")]
public string MyProperty { get; set; }
}
你仍然可以保持IValidatableObject你的代碼,並從一個操作方法驗證它像這樣:
[HttpPost]
public virtual JsonResult MyValidateAction(string myProperty)
{
var model = new MyModel{ MyProperty = myProperty, };
var results = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(model,
new ValidationContext(model, null, null), results, true);
return isValid
? Json(true)
: Json(results[0].ErrorMessage);
}
以上操作方法做幾乎同樣的事情作爲默認的模型粘合劑。它構建你的視圖模型的一個實例,然後驗證它。所有的驗證規則都會被檢查,包括你的IValidatableObject代碼。如果需要將更多屬性發送到構建視圖模型的操作方法,則可以使用RemoteAttribute的AdditionalFields屬性進行操作。
希望這會有所幫助。
你是指客戶端,對嗎?如果是,那麼你有沒有在視圖中包含驗證腳本 – 2012-01-06 13:10:14
你能顯示你的代碼嗎? – 2012-01-06 14:00:37