2012-11-09 11 views
1

假設我有一個例子實體:實體框架/ ASP MVC關係驗證:檢查密鑰或對象?

public class City 
{ 
    public int CityId { get; set; } 
    public string Name { get; set; } 

    public int StateId { get; set; } 
    public virtual State State{ get; set; } 
} 

有幾個在其中創建新城市的情況。 1)通過在一個視圖中的用戶,從現有狀態中選擇:

@Html.DropDownListFor(it => it.StateId, ViewBag.States) 

2)中的情況下的後端,其中所述狀態可能是新的也:

State newState = context.States.Create(); 
newState.Name = "North Takoma"; 

City newCity = context.Cities.Create(); 
newCity.Name = "Springfield"; 
newCity.State = newState; 

context.States.Attach(newState); 
context.Cities.Attach(newCity);  

context.SaveChanges(); 

是必需的狀態關係並且應該被驗證。問題是我們應該驗證StateID還是實際的國家關係對象? (使用FluentValidation這裏,但會使用數據註釋相當類似的情況)

public class CityValidator : AbstractValidator<City> 
{ 
    public CityValidator() 
    { 
     // this? 
     RuleFor(it => it.StateID).NotEmpty(); 

     // or this? 
     RuleFor(it => it.State).NotNull(); 
    } 
} 

在第一種情況下,STATEID將被填充,但不在狀態的對象;對於第二種情況反之亦然。

我可以把我的驗證器中的自定義邏輯來檢查一個或另一個;然而,在我看來,我失去了不顯眼的驗證屬性。任何好的,幹這個問題的解決方案?

編輯說明:在該示例中,可以通過設置StateID(對於現有狀態)或State屬性(對於新狀態)爲城市指定州。那麼如何設置驗證並在我的視圖中仍然可以獲得輸入中的「data-val-required」屬性?

回答

1

如果我理解正確,用戶可能會或可能不會選擇狀態?我對嗎?

你,

首例:STATEID將被填充,但不在狀態的對象。

RuleFor(c => c.StateId).NotEmpty().When(s => s.State != null).WithMessage("Please select state."); 

第二種情況:對於第二種情況

我從喲,這將在服務器端發生的瞭解,反之亦然,因此你沒有必要爲這個規則。

希望這會有所幫助。

+0

是的,我走了那條路。但是,我不相信在規則集中使用.When擴展時,將會設置不顯眼的驗證屬性。 – enoshixi