MVC4验证DataAnnotations无效(未验证)

Mik*_*rks 0 c# validation asp.net-mvc data-annotations

我有一个非常复杂的模型和视图(下图).我只有一个必填项(Key Active Mg).当我标记[Required(ErrorMessage="Key Active Mg is required")]并@Html.ValidationMessageFor为该字段设置时,我的应用程序将允许我输入任何内容并单击"保存".当然Model.IsValid会回来false.它没有返回并以红色标出该字段,表明它是必需的.有谁知道为什么?

我的模特:

    public class RawValues
    {
        [Key]
        public int Pk { get; set; }

        public int? FillerFk { get; set; }
        [Display(Name = "Filler")]
        [ForeignKey("FillerFk")]
        public virtual Filler Filler { get; set; }

        public int? CapsuleFk { get; set; }
        [Display(Name = "Capsule")]
        [ForeignKey("CapsuleFk")]
        public virtual Capsule Capsule { get; set; }

        public int? KeyActiveFk { get; set; }
        [Display(Name = "Key Active")]
        [ForeignKey("KeyActiveFk")]
        public virtual KeyActive KeyActive { get; set; }

        [Display(Name="API #1")]
        public int? Active1 { get; set; }

        [Display(Name = "API #2")]
        public int? Active2 { get; set; }

        [Display(Name = "API #3")]
        public int? Active3 { get; set; }

        [Display(Name = "API #4")]
        public int? Active4 { get; set; }

        [Display(Name = "API #5")]
        public int? Active5 { get; set; }

        [Display(Name = "Key Active Mg")]
        [Required(ErrorMessage="Key Active Mg is required.")]
        public int KeyActiveMg { get; set; }

        [Display(Name = "E4M")]
        public bool E4M { get; set; }

        [Display(Name = "K100M")]
        public bool K100M { get; set; }

        public int TimeReleaseFillerFk { get; set; }
        public int NumberCapsules { get; set; }

        public string CreatedBy { get; set; }
        public DateTime CreatedDate { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

我的看法:

@model CapWorx.QuikCap.Models.RawValues

@* This partial view defines form fields that will appear when creating and editing entities *@

<div data-role="fieldcontain">
    @Html.LabelFor(model => model.Capsule, new { @class = "ui-input-text" })
    @Html.DropDownListFor(m => m.Capsule.Pk, new SelectList(ViewBag.Capsules, "Pk", "Name", "Pk"))
</div>
<div data-role="fieldcontain">
    @Html.LabelFor(model => model.Active1)
    @Html.EditorFor(model => model.Active1)
</div>
<div data-role="fieldcontain">
    @Html.LabelFor(model => model.Active2)
    @Html.EditorFor(model => model.Active2)
</div>
<div data-role="fieldcontain">
    @Html.LabelFor(model => model.Active3)
    @Html.EditorFor(model => model.Active3)
</div>
<div data-role="fieldcontain">
    @Html.LabelFor(model => model.Active4)
    @Html.EditorFor(model => model.Active4)
</div>
<div data-role="fieldcontain">
    @Html.LabelFor(model => model.Active5)
    @Html.EditorFor(model => model.Active5)
</div>
<div data-role="fieldcontain">
    @Html.LabelFor(model => model.KeyActive, new { @class = "ui-input-text" })
    @Html.DropDownListFor(m => m.KeyActive.Pk, new SelectList(ViewBag.KeyActives, "Pk", "Name", "Pk"))
</div>
<div data-role="fieldcontain">
    @Html.LabelFor(model => model.KeyActiveMg)
    @Html.EditorFor(model => model.KeyActiveMg)
    @Html.ValidationMessageFor(model => model.KeyActiveMg)
</div>
<div data-role="fieldcontain">
    @Html.LabelFor(model => model.E4M)
    @Html.DropDownListFor(x => x.E4M,
                              new[] { 
                                    new SelectListItem() { Text = "Off", Value = "False", Selected = true }, 
                                    new SelectListItem() { Text = "On", Value = "True" } },
                              new { data_role = "slider" })
</div>
<div data-role="fieldcontain">
    @Html.LabelFor(model => model.K100M)
    @Html.DropDownListFor(x => x.K100M,
                              new[] { 
                                    new SelectListItem() { Text = "Off", Value = "False", Selected = true }, 
                                    new SelectListItem() { Text = "On", Value = "True" } },
                              new { data_role = "slider" })
</div>
<div data-role="fieldcontain">
    @Html.LabelFor(model => model.Filler, new { @class = "ui-input-text" })
    @Html.DropDownListFor(m => m.Filler.Pk, new SelectList(ViewBag.Fillers, "Pk", "Name", "Pk"))
    @Html.ValidationMessage("FillerName", "Filler is required")
</div>
Run Code Online (Sandbox Code Playgroud)

我的控制器:

[HttpPost]
        public ActionResult Create(RawValues rawvalues)
        {
            rawvalues.CreatedBy = User.Identity.Name;
            rawvalues.CreatedDate = DateTime.Now;
            rawvalues.TimeReleaseFillerFk = Helpers.OperationContext.GetTimeReleaseFillerFk(rawvalues.E4M, rawvalues.K100M);

            rawvalues.CapsuleFk = rawvalues.Capsule.Pk;
            rawvalues.FillerFk = rawvalues.Filler.Pk;
            rawvalues.KeyActiveFk = rawvalues.KeyActive.Pk;

            rawvalues.Filler = Helpers.OperationContext.GetFiller(rawvalues.Filler.Pk);
            rawvalues.Capsule = Helpers.OperationContext.GetCapsule(rawvalues.Capsule.Pk);
            rawvalues.KeyActive = Helpers.OperationContext.GetKeyActive(rawvalues.KeyActive.Pk);

            rawvalues.NumberCapsules = 100;

            var errors = ModelState.Values.SelectMany(v => v.Errors);

            if (ModelState.IsValid) {
                rawvaluesRepository.InsertOrUpdate(rawvalues);
                rawvaluesRepository.Save();
                List<Results> results = Helpers.OperationContext.CallCalculate(rawvalues);
                return View("Results", results);
            } else {
                ViewBag.Error = "Model State was not valid.";
                return View("Error");
            }
        }
Run Code Online (Sandbox Code Playgroud)

我的截图:

在此输入图像描述

UPDATE

我已将控制器代码更新为以下内容:

    if (ModelState.IsValid) {
        rawvaluesRepository.InsertOrUpdate(rawvalues);
        rawvaluesRepository.Save();
        List<Results> results = Helpers.OperationContext.CallCalculate(rawvalues);
        return View("Results", results);
    } else {
        ViewBag.Capsules = Helpers.OperationContext.GetCapsules();
        ViewBag.Fillers = Helpers.OperationContext.GetFillers();
        ViewBag.KeyActives = Helpers.OperationContext.GetKeyActives();
        return View();
    }
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题.我需要返回相同的视图以在屏幕上显示错误.使用DataAnnotations Validation,表单确实命中了Create的HttpPost方法,如果有错误(验证错误),ModelState.IsValid将返回false,在这种情况下我需要返回相同的视图.见下面的截图!

在此输入图像描述

Shy*_*yju 5

看起来你正在返回另一个视图(错误),如果ModelState.IsValid是false.您应该将发布的viewmodel返回到同一个create视图.

public ActionResult Create(RawValues model)
{
  if(ModelState.IsValid)
  {
     //everything is good. Lets save and redirect
  }
  return View(model);
}
Run Code Online (Sandbox Code Playgroud)