Подтвердить что ты не робот

Сообщения проверки отображаются при загрузке страницы

У меня проблема с проверкой в ​​ASP.NET MVC 2.0. Я использую одно и то же действие в контроллере для выполнения запроса пользователя.
Например:

public ActionResult Index(ReportModel model)
{
    if (!model.IsInitialDisplay && ModelState.IsValid)
    {
        model.Result = service.GetResult(model);                
    }
    return View(model);
}  

В ReportModel я определяю флаг IsInitialDisplay, чтобы определить, была ли страница начальной или нет:

public class ReportModel
{
    [Required(ErrorMessage = "*")]
    public string Criteria { get; set; }
    public bool IsInitialDisplay { get; set; }
    public ReportResult Result { get; set; }

    public ReportModel()
    {
        IsInitialDisplay = true;
    }
}  

И в представлении я использую следующий код:

<% using (Html.BeginForm())
   { %>
<table>
    <tr>
        <th>
            Criteria:
        </th>
        <td>
            <%= Html.TextBox("Criteria", "") %>
            <%= Html.ValidationMessage("Criteria") %>
        </td>
    </tr>
</table>
<br />
<input type="submit" value="Submit" />
<%= Html.Hidden("IsInitialDisplay", false) %>
<% } %>  

Как я ожидаю, если пользователи не будут вводить какое-либо значение для критериев и нажать кнопку "Отправить", появится сообщение об ошибке для проверки.
Но сообщение об ошибке проверки всегда отображается на начальной загрузке страницы, я не знаю, как его предотвратить?
Кто-нибудь знает? Спасибо,

[Обновлено]
Я обновил свой метод действий, как показано ниже, и это выглядит нормально:

public ActionResult Index(ReportModel model)
{
    // Collecting some commons data here...

    if (model.IsInitialDisplay)
    {
        ModelState.Clear();
    }
    else if (ModelState.IsValid)
    {
        model.Result = service.GetResult(model);                
    }
    return View(model);
}
4b9b3361

Ответ 1

Причина, по которой сообщение об ошибке отображается при начальной загрузке страницы, заключается в том, что в вашем аргументе в качестве аргумента используется модель ReportModel. Когда вы впервые получаете доступ к этому действию с помощью /Home/Index, вы не передаете никаких аргументов, и когда связующее устройство по умолчанию пытается связать с экземпляром ReportModel, оно вызывает ошибки проверки.

Плохая практика заключается в том, чтобы использовать одно и то же действие для рендеринга и обработки представления формы, но если вы действительно хотите это сделать, вы можете попробовать следующее:

public ActionResult Index(bool? isInitialDisplay)
{
    if (isInitialDisplay.HasValue && !isInitialDisplay.Value)
    {
        var model = new ReportModel();
        UpdateModel(model);
        if (ModelState.IsValid)
        {
            model.Result = service.GetResult(model);                
        }
        return View(model);
    }

    // Initial request
    return View(new ReportModel());
}

В этом случае вам больше не понадобится свойство IsInitialDisplay на вашей модели или конструктор, который устанавливает его в true.

Это, как говорится, здесь рекомендуемый способ:

public ActionResult Index()
{
    var model = new ReportModel();
    return View(model);
}

[HttpPost]
public ActionResult Index(ReportModel model)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }
    model.Result = service.GetResult(model);                
    return View(model);
}

Ответ 2

Вот простое решение, которое сочетает в себе хорошие ответы:

[HttpGet]
public ActionResult Index(ReportsModel model)
{
    ModelState.Clear(); //clears the validation

    return View(model);
}

[HttpPost]
public ActionResult Index(ReportsModel model, string unused)
{
    ...
}

Это использует метод http, чтобы определить, загрузили ли он первую загрузку (например, решение Дарина).

Самое главное, что MVC создает ваш контроллер вместо того, чтобы вручную вводить его самостоятельно. Это важно, если вы используете инъекцию зависимостей или имеете другие контекстуальные данные, входящие в строку запроса (например, идентификатор вложенного ресурса).

Ответ 3

Model

public class ReportModel
{
     [Required(ErrorMessage = "*")]
     public string Criteria { get; set; }
}

Вид

<% Html.EnableClientValidation(); %>    

<% using (Html.BeginForm())
{ %>
     <%= Html.TextBoxFor(model => model.Criteria) %>
     <%= Html.ValidationMessageFor(model => model.Criteria) %>

     <input type="submit" value="Submit" />
<% } %>  

Работает нормально