@Html.ValidationMessageДля того, чтобы не мешать пользователю пропускать обязательные поля

#asp.net #asp.net-mvc #validation #model-view-controller

#asp.net #asp.net-mvc #проверка #модель-представление-контроллер

Вопрос:

У меня есть следующий код. Я также добавил необходимые файлы сценариев для проверки полей, но проверка, похоже, не работает. Требуемые поля могут быть пропущены, даже если пользователь не вводил никаких входных данных. Может кто-нибудь, пожалуйста, помочь? Спасибо! Я опубликовал часть кода ниже. В моем исходном коде намного больше выпадающих меню, и ни одна из проверок формы не работает.

Модель:

 public class User
{
  
    [Required]
    [Display(Name = "Gender")]
    public string gender { get; set; }
    
    
}


}
  

Вид:

 <body>
<div>

    <div class="card">
        <div class="row" style="padding-left:360px;">
            <p style="font-size:25px; font-weight: bold; text-align:center; padding-top: 50px; text- 
       align : center;"><u>Tell Us a Bit about Yourself! </u></p>
        </div>

        @using (Html.BeginForm("Register", "Register", FormMethod.Post, new { @class = "my_form" }))
        {
            @Html.ValidationSummary(true, "", new
               {
                   @class ="text-danger"
               })
    
        <table class="row" style="background-color:rgba(0, 0, 0, 0);">
            <tr>

                <td>
                    @Html.LabelFor(model => model.gender,
htmlAttributes: new { @class = "register.css" })

                </td>
                <td>
                    <div>
                        @Html.DropDownListFor(model => model.gender,
    new SelectList(Enum.GetValues(typeof(Gender))), "Select Gender"
    )

                        @Html.ValidationMessageFor(model =>
    model.gender, "", new { @class = "text-danger" })
                    </div>
                </td>
            </tr>
         <tr>
                <td></td>
                <td class="please-no">
                    <div>
                        <button type="submit" class="btn btn-primary" style=" 
       float:right; padding: -20px;">Next</button>
                    </div>
                </td>
            </tr>
        </table>
        }

    </div>
    <script>
@section scripts{
@Scripts.Render("~/bundles/jqueryval")
  

}

Контроллер:

     [HttpGet]
    public ActionResult Register()
    {
        return View(new User());
    }

    [HttpPost]
    public ActionResult Register(User user)
    {
        if (ModelState.IsValid)
        {
           
            return RedirectToAction("Register");
        }
        Session["user"] = user;
         return RedirectToAction("PersonalPreference", "Preference");
    }
  

Комментарии:

1. Это вид, который вы редактируете _Layout.cshtml ? Я спрашиваю, потому что вижу <body> отображение тега и скрипта. Я также не вижу @model вверху директивы, в которой указано, что представление может ожидать User , что ему будет передан экземпляр. Если это не _Layout.cshtml так, или пользовательский макет, что маловероятно, если вы только начинаете, представления не требуют <body> определения. Если вы посмотрите, _Layout.cshtml там есть вызов @RenderBody() . Это вводит выходные данные (т.Е. HTML, JS) из вашего контроллера (контроллеров) в макет, поэтому вам не нужно переопределять свой макет в каждом представлении.

2. @JohnH да, я использую layout.cshtml У меня тоже есть модель типа User в начале моего кода. Извините, я должен был добавить это в вопрос..

3. Хорошо, у вас здесь проблема. Добавляя эту @model User директиву к вашей _Layout.cshtml , это означает, что вы ожидаете, что каждое действие контроллера будет передавать User модель. Вы можете убедиться в этом сами, создав новый контроллер, создав для него новый тип модели, добавив соответствующий вид и указав @model NewModel в его верхней части. Если вы перейдете к маршруту, он выдаст, потому что он все равно будет ожидать User .

4. Для того, что вы хотите сделать (т. Е. Иметь регистрационную форму, которая всегда видна, независимо от того, какой маршрут просматривает пользователь), и предполагая MVC 5, посмотрите, как работают дочерние действия, в частности, с использованием @Html.RenderAction() или @Html.RenderPartial() в вашем макете. Это позволит вам переместить имеющийся у вас код в отдельный .cshtml , который ожидает вашего User , в то время как у вас могут быть другие маршруты, работающие с использованием других моделей.

Ответ №1:

Я, наконец, нашел решение этой проблемы. Пришлось добавить следующие файлы скриптов. Спасибо, ребята, за ваше время!

 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.js"></script>
<script 
src="https://cdnjs.cloudflare.com/ajax/libs/jqueryvalidate/1.19.1/jquery.validate.js"> 
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation- 
unobtrusive/3.2.11/jquery.validate.unobtrusive.js"></script>
  

Комментарии:

1. Спасибо за публикацию вашего решения, но, пожалуйста, в какой-то момент прочтите мои комментарии.

2. @JohnH большое вам спасибо за объяснение! Я понятия не имел об этом. Тем не менее, мой веб-сайт действительно маленький, и у меня есть только одно действие в моем контроллере, поэтому пока оно работает для меня. Но я обязательно буду помнить об этом для будущего использования.