MVC 5 - Пользовательская проверка - выбрано значение DropDownList, тогда требуется другой элемент управления - PullRequest
1 голос
/ 19 июня 2019

В настоящее время у меня есть представление с некоторыми выпадающими списками и другими элементами управления.У меня сейчас почти все работает правильно, когда выбран определенный вариант, тогда требуются другие элементы управления.У меня есть только настройка с этим 1 условием в данный момент.

Я хотел бы спросить совета, должен ли я установить bool для каждого свойства элемента управления, и если его true разрешить его передачу, в противном случае установите его в false.

Я также хотел спросить, как сделатьЯ установил сообщение для каждого свойства, которое я проверяю?У меня есть 2 текстовых поля и 1 другой DDL, которые нуждаются в значении, если выбрано определенное значение в этом другом ddl.Вот что у меня сейчас есть.

Что бы вы сделали?Если использование = 2, тогда требуемые проекты, количество и единицы не могут быть нулевыми, и как я могу получить сообщение для каждого высказывания, если оно ложно?

Модель:

//[CheckDropDown(ErrorMessage = "When Usage = '2' Quantity and Units CAN'T be NULL!")]
        [Required]
        [CheckDropDown]
        public int Usage { get; set; }

        /* INT OR STRING ?? */
        /* If USAGE selection no imm reqs pass else REQPROJ required */        
        [Display(Name = "Required Project(s)")]
        public string RequiredProject { get; set; }

       // [Required]
        [Range(0, Int32.MaxValue)]
        //[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:#}")]
        public int Quantity { get; set; }

        //if quantity picked than units required
       // [Required]
        public int? Units { get; set; }

Просмотр:

<div class="form-group row">
  <div class="col-md-4 col-lg-4">
    @Html.LabelFor(x => x.Usage,
          htmlAttributes: new { @class = "control-label" })
  </div>
  <div class="col-md-8 col-lg-8">
    @Html.DropDownListFor(x => x.Usage,
          (IEnumerable<SelectListItem>)ViewBag.UsageDDL,
          "", new { @class = "form-control" })
    @Html.ValidationMessageFor(x => x.Usage, "",
          new { @class = "text-danger" })
  </div>
</div>

<div class="form-group row">
  <div class="col-md-4 col-lg-4">
    @Html.LabelFor(x => x.RequiredProject,
          htmlAttributes: new { @class = "control-label" })
  </div>
  <div class="col-md-8 col-lg-8">
    @Html.EditorFor(x => x.RequiredProject, new {
        htmlAttributes =
          new { @class = "form-control" }
    })
    @Html.ValidationMessageFor(x => x.RequiredProject, "",
          new { @class = "text-danger" })
  </div>
</div>

@* Think about Textboxes on SAME line or SEPERATE *@
<div class="form-group row">
  <div class="col-md-4 col-lg-4">
    @Html.LabelFor(x => x.Quantity,
          htmlAttributes: new { @class = "control-label" })
  </div>
  <div class="col-md-8 col-lg-8">
    @Html.EditorFor(x => x.Quantity, new {
        htmlAttributes =
          new { @class = "form-control", @type = "number" }
    })
    @Html.ValidationMessageFor(x => x.Quantity, "",
          new { @class = "text-danger" })
  </div>
</div>

<div class="form-group row">
  <div class="col-md-4 col-lg-4">
    @Html.LabelFor(x => x.Units,
          htmlAttributes: new { @class = "control-label" })
  </div>
  <div class="col-md-8 col-lg-8">
    @Html.DropDownListFor(x => x.Units,
          (IEnumerable<SelectListItem>)ViewBag.UnitsDDL,
          "", new { @class = "form-control" })
    @Html.ValidationMessageFor(x => x.Units, "",
          new { @class = "text-danger" })
  </div>
</div>

Пользовательский метод проверки:

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
            {
                //return base.IsValid(value, validationContext);

                //var model = (CustomVaildModel)validationContext.ObjectInstance;
                var model = (PartNumberViewModel)validationContext.ObjectInstance;

                // Allow value 1 to have choices as well
                //if(model.Usage == "1" && model.RequiredProject != null)
                if(model.Usage == 1)
                {
                    if(model.RequiredProject != null)
                    {
                        var errorMsg = "If there are 'No Immediate Requirements' for this part number, then a 'Required Project' is not necessary.";
                        return new ValidationResult(errorMsg);
                    }
                    else
                    {
                        return ValidationResult.Success;
                    }                    
                }
                else if(model.Usage == 2 && model.RequiredProject == null && model.Quantity.Equals(0) && model.Units == null)
                {
                    //FormatErrorMessage(validationContext.DisplayName);
                    var errorMsg = "When Usage = 'Procure for Projects listed' Quantity and Units CANNOT BE EMPTY!";
                    return new ValidationResult(errorMsg);                   
                }
                else
                {
                    return ValidationResult.Success;
                }
            }
        }

1 Ответ

0 голосов
/ 20 июня 2019

Вы также можете выполнить проверку в действии контроллера:

public ActionResult SomeAction(TheModel model)
{
    if (model.Usage == 2)
    {
        if (model.Quantity == null) // quantity is changed to nullable
        {
            ModelState.AddModelError("Quantity", "Value is required for this usage");
        }
    }

    ....
    if (ModelState.IsValid)
    {
        ...
    }
    else
    {
        return View(model); // there are validation errors
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...