2016-01-06 103 views
1

因此,我有一個User Model類。它有名單UnitViewModelMVC ModelState驗證複雜屬性列表

public class UserViewModel 
{ 
    [Required(ErrorMessage="FirstName")] 
    public string FirstName { get; set; } 

    [Required(ErrorMessage = "LastName")] 
    public string LastName { get; set; } 

    public List<UnitViewModel> DesiredUnits { get; set; } 
} 

public class UnitViewModel 
{ 
    public Guid? UnitID { get; set; } 
    [Required(ErrorMessage = "NAMEEE")] 
    public string Name { get; set; } 

    public bool Selected { get; set; } 
} 

當我嘗試創建新User我張貼UserViewModel從我的觀點。這裏我得到ModelState.IsValidfalse。這是因爲驗證還檢查UnitViewModel.Name屬性爲空(並且這是正常的,因爲我創建了User,並且我有checkbox列表用於UnitViewModel。用戶從現有的UnitViewModel列表中選擇UnitViewModel列表)。

我可以通過foreach循環以可怕的方式修復ModelState["DesiredUnits[0].UnitID"].Errors.Clear()但我不會。

那麼,解決方案是什麼?如何禁用模型複雜屬性列表的驗證?

UPDATE
另一種解決方案,我目前使用的是要有HiddenFor(m=>m.Name)UnitViewModel的編輯模板,但這種方法的缺點是:Name是不必要的,當我已經有標籤的editortemplate。此外,如果我有更多必填字段,我將不得不爲每個字段提供相應的隱藏輸入。

+0

你能渲染你的創建視圖的方式,你沒有任何字段鏈接的DesiredUnits屬性? Thant方式ListView的UnitViewModel將保持空,並沒有名稱驗證完成 –

+0

我有'EditorTemplate'爲具有'UnitID'和'Name'的DesiredUnits'。當創建User時,我必須顯示它,因爲他們需要選擇所需的單位 – levi

+0

嘗試使用可爲空的DesiredUnits,然後 – maztt

回答

0

如果您的請求視圖模型包含指定視圖不需要的屬性或驗證規則,則應爲此創建一個新對象。

// New model, specific for request 
public class UserRequestViewModel 
{ 
    [Required(ErrorMessage="FirstName")] 
    public string FirstName { get; set; } 

    [Required(ErrorMessage = "LastName")] 
    public string LastName { get; set; } 
} 

public ActionResult Index(UserRequestViewModel requestModel) 
{ 
    //... do something 

    // Get the values required to return to the view 
    var responseModel = new UserViewModel(); 
    responseModel.DesiredUnits = new List<UnitViewModel>(); 

    // Return the response model 
    return View(responseModel); 
} 

如果你做這種方式,顯然對任何人對你的應用程序開發,什麼是可以接受被張貼到你的行動。

另外,如果你決定,你不能裸露創建整個新模式爲此,請將您的驗證到控制器的動作:

public ActionResult Index(UserViewModel requestResponseModel) 
{ 
    // Perform validation 
    for (var i = 0; i < requestResponseModel.DesiredUnits.Count(); i++) 
    { 
     var validationErrorKey = string.Format("DesiredUnits[{0}]", i); 

     // Is the Name property empty? 
     if (string.IsNullOrWhiteSpace(requestResponseModel.DesiredUnits[i].Name)) 
     { 


      this.ModelState.AddModelError("Posted Name cannot be empty", validationErrorKey); 
     } 
    } 

    if (this.ModelState.IsValid) 
    { 
     // There was a model validation error 
    } 

    //... do something 

    // Return the response model 
    return View(requestResponseModel); 
} 

作爲最後的手段,你可以使用,但我不知道這是否阻止該領域的驗證 - 你需要給一個去:

public ActionResult Index([Bind(Exclude = "DesiredUnits")]UserViewModel requestResponseModel) 
{ 
    // ... do something 
} 
0

使用

[HttpPost]  
    public ActionResult CreateEnquiryOnly([Bind(Include="FirstName,LastName")]UserViewModel userviewmodel) 
    { 
     if(ModelState.IsValid) 
     {  
     } 
    }