2017-05-31 47 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