2016-12-23 21 views
0

我有如下描述的模型的其他實體:asp.NET MVC實體驗證依賴於同類型

public class Projet 
    { 
    public int ProjetId { get; set; } 

    public int SeqNumber{ get; set; } 
    public string Code{ get; set; } 
    public string Description { get; set; } 
    public bool Std{ get; set; } 
    public bool Archive { get; set; } 
    } 

我有一個創建視圖,讓用戶創建一個新的項目,我必須讓SeqNumber字段是免費的,用戶可以輸入他想要的任何數字。 但是,如果已選擇SeqNumber,我必須返回一個錯誤。

我不知道如何實現這一點。我應該在我的ProjetsController/Create操作中做一些驗證嗎?從我發現的情況來看,在控制器中驗證東西是一種不好的做法,但我不能想到在何種情況下需要實現驗證,這取決於同一類的其他成員。 爲MVC編寫自定義驗證器會考慮一個好的做法嗎?

謝謝!

+0

我想你是尋找*遠程驗證*一個好地方開始:https://msdn.microsoft.com/en-us/library/gg508808(vs.98).aspx – Daniel

+0

驗證沒有錯誤創建操作中的值。事實上,根據該領域的語義,這可能是一個業務規則,在這種情況下,它應該在後端進行驗證。話雖如此,你總是可以用一些JS編寫你自己的驗證方案,並在後端(像Web服務或類似的東西)上啓動一個方法來查看值是否存在。儘管如此,我仍然建議在後端做它。 – JuanR

回答

0

您可以在處理您的HTTP POST操作方法使用此表單提交

[HttpPost] 
public ActionResult Create(Projet model) 
{ 
    var exist = db.Projects.Any(s=>s.SeqNumber===model.SeqNumber 
           && s.ProjectId!=model.ProjectId); 
    if(exist) 
    { 
    ModelState.AddModelError(string.empty,"Sequence number is already in use"); 
    return View(model); 
    } 
    // to do : Continue with your save 
} 

現在,當用戶提交表單時,如果正在使用的序列號是任何其他項目,它會拋出一個驗證信息。確保您在視圖中使用驗證摘要助手來呈現驗證錯誤消息。

@model Project 
@Html.ValidationSummary(false) 
@using(Html.BeginForm()) 
{ 
    <!-- your existing code goes here--> 
} 

現在爲了提供良好的用戶體驗,您可以利用遠程驗證功能。它所做的是,當用戶從輸入中取出焦點時,它會對服務器進行ajax調用,以檢查您的SequenceNumber是否存在於db中。根據結果​​,驗證消息將顯示給用戶。

要做到這一點,請使用Remote屬性來修飾您的財產。

[Required] 
[System.Web.Mvc.Remote("CheckSeqNumber", "Project", 
              ErrorMessage = "SeqNumber is already used!")] 
public int SeqNumber { get; set; } 

現在確保您有一個名爲CheckSeqNumber操作方法返回true或false作爲一個JSON響應。

public ActionResult CheckTagName(int SeqNumber) 
{ 
    var exist= !db.Projects.Any(g => g.SeqNumber == SeqNumber); 
    return Json(exist,JsonRequestBehavior.AllowGet); 
} 

此外,請確保您已加載相關的JavaScript文件來做這個不顯眼的驗證。

<script src="~/Scripts/jquery.validate.js"></script> 
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script> 

另一種方法是寫一個做到這一點檢查你(如果你不喜歡的動作方法檢查),自定義驗證屬性。 Here是一個SO帖子,解釋如何做到這一點。

+1

真棒解釋謝謝。這應該讓我去。 – JonD