Сообщения проверки отображаются при загрузке страницы - PullRequest
11 голосов
/ 18 марта 2011

У меня проблема с проверкой в ​​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);
}

Ответы [ 3 ]

32 голосов
/ 18 марта 2011

Причина, по которой при начальной загрузке страницы отображается сообщение об ошибке, заключается в том, что действие вашего контроллера принимает в качестве аргумента модель 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);
}
5 голосов
/ 01 августа 2012

Вот простое решение, сочетающее в себе несколько хороших ответов:

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

    return View(model);
}

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

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

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

0 голосов
/ 18 марта 2011

Модель

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

View

<% Html.EnableClientValidation(); %>    

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

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

Отлично работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...