2017-05-31 48 views
1

我有有一些必填字段,其中一些沒有任何驗證的模型。但是,儘管填充了所有這些文本框,但我的ModelState.IsValid仍然給我一個錯誤。我正在使用實體框架。我錯過了什麼?數據註解工作錯誤

型號

public class EDModel 
{ 
    public Guid Id { get; set; } 
    [Required] 
    [Display(Name = "Number of beds")] 
    public int Beds { get; set; } 
    [Required] 
    [Display(Name = "Number of Hospital Beds")] 
    public int HospitalBeds { get; set; } 
    public string Notes { get; set; } 
} 

查看

<div class="divPanel"> 
    @Html.HiddenFor(m => m.Id) 
    @Html.ValidationMessageFor(m => m.Id) 
    <div class="row"> 
     <div class="col-md-3"> 
      @Html.LabelFor(m => m.Beds) 
      @Html.TextBoxFor(m => m.Beds, new { @class = "form-control", @type = "number", title = "Total number of beds available " }) 
      @Html.ValidationMessageFor(m => m.Beds) 

     </div> 
     <div class="col-md-3"> 

      @Html.LabelFor(m => m.HospitalBeds) 
      @Html.TextBoxFor(m => m.HospitalBeds , new { @class = "form-control", @type = "number", title = "Total number of hospital beds" }) 
      @Html.ValidationMessageFor(m => m.HospitalBeds) 
     </div> 
    <div class="col-md-8"> 

      @Html.LabelFor(m => m.Notes) 
      @Html.TextAreaFor(m => m.Notes, new { @class = "form-control", title = "" }) 

     </div> 
    </div> 
</div> 

控制器

public ActionResult Update(EDModel model) 
    { 
     if(model.Id==null || model.Id == default(Guid)) 
     { 
      model.Id = Guid.NewGuid(); 
     }    
     if (ModelState.IsValid) 
     { 
     } 

     foreach (ModelState modelState in ViewData.ModelState.Values) 
     { 
      foreach (ModelError error in modelState.Errors) 
      { 
       var errors = ModelState.Keys.Where(k => ModelState[k].Errors.Count > 0).Select(k => new { propertyName = k, errorMessage = ModelState[k].Errors[0].ErrorMessage }); 
      } 
     } 
    } 

我嘗試設置方法內部的ID想這可能是問題,因爲它是在一個主鍵DB,但仍存在Model.IsValid錯誤。

EDIT 1:我已添加的ModelState錯誤,但該錯誤消息表示「需要的值。」但不是問題在哪個字段中。
編輯2:我添加了對ID的驗證,這是問題所在。儘管我把它設置在控制器中,但是沒有ID會引發錯誤。我添加了代碼建議,它仍然顯示id字段爲錯誤。

我意識到模型狀態錯誤是在提交和沒有點在控制器設置它仍然會是一個錯誤。那麼如何管理Id字段可能有值或可能爲空的情況。

+0

那麼,有什麼錯誤? – stuartd

+0

您顯示的模型名爲'EDModel',但您的視圖中的模型是'EDSaturationModel' - 它們不是相同的 –

+0

@StephenMuecke我已經在代碼中修復了它。 –

回答

1

Guid是非空類型,因此是自動Required。如果您的網頁的Model中沒有提供任何值,這可能會導致您的ModelState無效。您可以通過將Guid轉換爲Guid?類型或爲Id字段提供一個值來使其空缺,從而解決此問題。

如果這不能解決您的問題,您可以調試和檢查什麼是ModelState.Errors看到錯誤的原因是什麼。

+0

請看我最新的編輯。 –

1

的ModelState是附帶錯誤因爲形式(從視圖)提交的對象。即使您在設置Id(guid)時,ModelState仍然無效。

我建議你刪除你的隱藏元素的標識,如果你仍然需要它的操作方法進行初始化,保持代碼,你擁有它。

 ... 
     <div class="divPanel"> 
     @*@Html.HiddenFor(m => m.Id)*@ 
     <div class="row"> 
      <div class="col-md-3"> 
     ... 
+0

有些情況下,id將爲null,並且存在Get方法中存在id的情況。我如何管理? –

+0

這正是您需要在您的操作方法(後端)中執行的操作。根據你的必要性設置或不是ID。但是請保持您的ModelState有效或無效,具體取決於您允許用戶設置的字段。 – KodiakMx

0

如果您有需要重新驗證您的模型,那麼您可以從您的控制器類中的以下方法之一。

  • bool TryValidateModel(object model)

  • void ValidateModel(object model)

這兩個之間的區別是,如果至少一個驗證失敗的ValidateModel將拋出InvalidOperationException

如果上述方法之一對您不可用或者您不在控制器類中,則可以使用 ValidatorValidationContext類。
例子:

var model = new SomeModel(); //Has DataAnnotation attributes 
var validationContext = new ValidationContext(model); 
var list = new List<ValidationResult>(); 
if (!Validator.TryValidateObject(model, validationContext, list)) 
{ 
    //Error on validation. Check the list for more details. 
} 

有關ValidatorValidationContext一個更好的例子和說明,可以發現here