我有一個很大的模型(大的意思是模型類包含很多字段/屬性,並且每個都至少有一個驗證屬性(例如Required
,MaxLength
,MinLength
等))。而不是創建一個視圖與大量的輸入爲用戶填充模型與數據我想創建幾個視圖,其中用戶將填充模型字段的一部分,並進入下一步(某種「嚮導」)。在步驟之間重定向時,我將未填滿的模型對象存儲在Session
中。類似下面:如何驗證ASP .NET MVC中只有部分模型?
型號:
public class ModelClass
{
[MaxLength(100)] ...
public string Prop1{get;set;}
[MaxLength(100)] ...
public string Prop2{get;set;}
...
[Required][MaxLength(100)] ...
public string Prop20{get;set;}
}
控制器:爲Prop3
和Prop4
等
[HttpPost]
public ActionResult Step1(ModelClass postedModel)
{
// user posts only for example Prop1 and Prop2
// so while submit I have completly emty model object
// but with filled Prop1 and Prop2
// I pass those two values to Session["model"]
var originalModel = Session["model"] as ModelClass ?? new ModelClass();
originalModel.Prop1 = postedModel.Prop1;
originalModel.Prop2 = postedModel.Prop2;
Session["model"] = originalModel;
// and return next step view
return View("Step2");
}
[HttpPost]
public ActionResult Step2(ModelClass postedModel)
{
// Analogically the same
// I have posted only Prop3 and Prop4
var originalModel = Session["model"] as ModelClass;
if (originalModel!=null)
{
originalModel.Prop3 = postedModel.Prop3;
originalModel.Prop4 = postedModel.Prop4;
Session["model"] = originalModel;
// return next step view
return View("Step3");
}
return View("SomeErrorViewIfSessionBrokesSomeHow")
}
Step1
視圖僅具有用於Prop1
和Prop2
輸入,第二步視圖包含輸入但這是件事
當用戶處於打開狀態時(例如,步驟1),並使用超過100個字符的值填充Prop1時,客戶端驗證的長度可以正常工作。但是,當然,我必須驗證此值,並在控制器的服務器端進行驗證。如果我有充分的模式,我只希望做到以下幾點:
if(!ModelState.IsValid) return View("the same view with the same model object");
所以用戶必須再次,正確填寫表格。 但是在步驟1上用戶只填充了2個屬性20,我需要驗證它們。我無法使用ModelState.IsValid
,因爲模型狀態將無效。如您所見Prop20
標有[Required]
屬性,當用戶提交Prop1
和Prop2
時,Prop20
爲空,這就是爲什麼ModelState
無效。當然,我可以允許用戶進入第2步,填寫所有步驟並僅在最後一步驗證模型狀態,但我不想讓用戶在步驟1填寫不正確的情況下轉到第2步。我想在控制器中進行驗證。 所以問題是: 我怎樣才能驗證模型的一部分?我如何驗證只有一些模型屬性符合其驗證屬性?
您可以爲每個步驟創建不同的視圖模型,這可能是一個單獨的視圖。像ProductStep1ViewModel和ProductStep1View,但我會將它們命名爲比這更好。 –
@NickBray,ModelClass是從原始模型映射的視圖模型類,所以如果我將ModelClass創建爲其他特定步驟類的組合,我將不得不爲映射器添加大約40個映射規則以映射這些模型類,並且它將是一堆的代碼。我已經考慮過了,但感謝您的建議。 – Dmytro
@DmytroTsiniavsky您可以使用類似[Value Injecter](http://valueinjecter.codeplex.com/)的內容來避免必須明確設置映射規則。 – Mun