這就是設計遠程驗證的方式。它向控制器動作發送一個AJAX請求以執行一些驗證,如果這些驗證失敗,則阻止提交。
由於用戶可以禁用JavaScript並能夠在未執行任何客戶端驗證的情況下提交,因此您認爲在提交表單時應該執行相同的驗證是正確的。因此,例如,您可以將此驗證邏輯外部化爲單獨的方法,您可以從用於遠程驗證的控制器操作以及POST表單提交後的POST操作中調用該方法。
這裏是我的代碼顯著部分:
模型
[Remote("CheckEsistenzaTicket", "Validation")]
public string TicketHD { get; set; }
驗證控制器
[OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
public class ValidationController : Controller
{
private ITManagerRepository tmanagerRepository;
public ValidationController()
{
this.tmanagerRepository = new TManagerRepository(new TManagerContext());
}
public JsonResult CheckEsistenzaTicket(string TicketHD)
{
if (!tmanagerRepository.chkTicketExists(TicketHD))
return Json(true, JsonRequestBehavior.AllowGet);
string esiste = String.Format(CultureInfo.InvariantCulture,
"Il ticket {0} risulta già caricato!", TicketHD);
return Json(esiste, JsonRequestBehavior.AllowGet);
}
}
VIEW
<div class="editor-field">
@Html.EditorFor(model => model.TicketHD)
@Html.ValidationMessageFor(model => model.TicketHD)
</div>
謝謝@Darin Dimitrov。我也會實現一個驗證邏輯服務器端。 **但只是另一個問題**:MVC3'標準'驗證如何工作? 我在我的模型上設置了其他屬性規則,如[Required],[MaxLength]等...爲什麼對於這些規則,當我提交時,出現驗證錯誤,而對於我的Remote驗證,我沒有相同的行爲? 是否存在一種爲Remote屬性進行驗證工作的方法? 謝謝! – Larry 2012-01-12 12:40:25
@Larry,驗證屬性都來自'ValidationAttribute'。默認模型綁定器在嘗試綁定來自請求值的動作參數時調用驗證。因此,所有IsValid方法都會在數據註釋(包括RemoteAttribute)上調用。除此之外,下面是如何爲此屬性實現IsValid方法:public override bool IsValid(object value){return true; }'。現在你明白了爲什麼它不驗證服務器上的任何東西。如果你想執行驗證,你可以從它派生出來並覆蓋這個方法。 – 2012-01-12 12:55:10
再次感謝。我是編程新手。你能更好地解釋我怎麼能在我的情況下推導出這個方法嗎? 我把我的代碼的一些重要部分放在原始問題中,THX – Larry 2012-01-12 13:40:28