Необходимая проверка не пройдена, даже если в текстовом поле есть данные - PullRequest
0 голосов
/ 28 августа 2018

У меня есть страница поиска, у которой в качестве модели указан класс MyViewModel. У меня возникла проблема, когда поле выделяется красным цветом из-за отсутствия данных из атрибута [Required], хотя поле имеет значение.

Вот вид модели

public class MyViewModel
{
   [DisplayName("My Field")]
   [Required]
   public string MyField { get; set; }

   // This gets populated with search results from the database
   // whenever the user clicks the Search button and the page
   // posts back
   public List<Customer> SearchResults { get; set; }
}

Вот страница ASP

@model MyProgram.MyViewModel

@using (Html.BeginForm("ListMyData", "Test", FormMethod.Get, htmlAttributes: new { @id = "search-form", @class = "form-horizontal" }))
{
   <div class="form-group">
      @Html.LabelFor(model => model.MyField, new { @class = "control-label col-sm-2" })
      <div class="col-sm-2">
         @Html.TextBoxFor(model => model.MyField, htmlAttributes: new { @class = "form-control" })
      </div>
   </div>
}

Вот мой контроллер

public class TestController
{
   // The first time that the user navigates to this page, the "else" clause
   // will execute and the form will get populated with default values.  When
   // the user clicks the "search" button, the view model will get populated
   // with database search results
   public ActionResult ListMyData(MyViewModel viewModel)
   {
      if (!string.IsNullOrEmpty(viewModel.MyField))
      {
         // Search database and return results
         /* viewModel.SearchResults = [data from database] */
      }
      else
      { 
         viewModel.MyField = "something";
      }

      return View("ListMyData", viewModel);
   }
}

Значение «что-то» отображается в моем текстовом поле на странице, но текстовое поле выделяется красным. Это определенно атрибут [Required], который делает это, потому что красный исчезает, если я удаляю атрибут [Required].

Почему проверка не проходит, даже если в текстовом поле есть данные?

РЕДАКТИРОВАТЬ: Вот моя страница макета, показывающая мои сценарии.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title - My ASP.NET Application</title>
    @Styles.Render("~/Content/css")
    @Styles.Render("~/Content/DataTables/css/jquery.dataTables.css")
    @Scripts.Render("~/bundles/modernizr")
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body>
   @RenderBody()

   @Scripts.Render("~/bundles/jquery")
   @Scripts.Render("~/bundles/bootstrap")
   @Scripts.Render("~/Scripts/jquery.unobtrusive-ajax.min.js")
   @Scripts.Render("~/Scripts/DataTables/jquery.dataTables.min.js")
   @RenderSection("scripts", required: false)
</body>
</html>

1 Ответ

0 голосов
/ 28 августа 2018

Проблема в том, что вы получаете проверки от ModelState от viewModel, который вы получаете в качестве аргумента (который по умолчанию не имеет значения).

Чтобы решить эту проблему, нужно очистить состояние модели перед возвратом.

ModelState.Clear();
return View("ListMyData", viewModel);
...