2009-09-01 3 views
2

Я пытался отслеживать учебные руководства и примеры в Интернете, например, от David Hayden's Blog и официального ASP.Net MVC Tutorials, но я не могу получить код ниже для отображения фактических ошибок проверки. Если у меня есть мнение, что выглядит примерно так:ASP.NET MVC: сообщения проверки, установленные в TryUpdateModel, не отображаются ValidationSummary

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.Parent>" %> 

<%-- ... content stuff ... --%> 

<%= Html.ValidationSummary("Edit was unsuccessful. Correct errors and retry.") %> 
<% using (Html.BeginForm()) {%> 

<%-- ... "Parent" editor form stuff... --%> 

     <p> 
      <label for="Age">Age:</label> 
      <%= Html.TextBox("Age", Model.Age)%> 
      <%= Html.ValidationMessage("Age", "*")%> 
     </p> 

<%-- etc... --%> 

Для модели класса, который выглядит следующим образом:

public class Parent 
{ 
    public String FirstName { get; set; } 
    public String LastName { get; set; } 
    public int Age { get; set; } 
    public int Id { get; set; } 
} 

Всякий раз, когда я ввожу неверный возраст (поскольку Возраст объявлен как межд), например, «xxx» (не целое число), вид делает правильно отображать сообщение «Редактировать было неудачно. Исправить ошибки и повторить попытку» в верхней части экрана, а также выделить текстовое поле «Возраст» и поместить красную звездочку рядом с ним, указав ошибку. Однако с помощью ValidationSummary не отображается список сообщений об ошибках. Когда я делаю свою собственную проверку (например: для LastName ниже), сообщение отображается правильно, но встроенная проверка TryUpdateModel не отображает сообщение, когда поле имеет незаконное значение.

Здесь действие вызывается в мой код контроллера:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult EditParent(int id, FormCollection collection) 
    { 
     // Get an updated version of the Parent from the repository: 
     Parent currentParent = theParentService.Read(id); 

     // Exclude database "Id" from the update: 
     TryUpdateModel(currentParent, null, null, new string[]{"Id"}); 
     if (String.IsNullOrEmpty(currentParent.LastName)) 
      ModelState.AddModelError("LastName", "Last name can't be empty."); 
     if (!ModelState.IsValid) 
      return View(currentParent); 

     theParentService.Update(currentParent); 
     return View(currentParent); 
    } 

Что я пропустил?

ответ

2

Я загрузил и посмотрел на ASP.NET MVC v1.0 source code от Microsoft и обнаружил, что либо случайно, либо по дизайну не существует способа делать то, что я хочу делать, по крайней мере по умолчанию. По-видимому, во время вызова UpdateModel или TryUpdateModel, если проверка целостности целого числа (например) не выполняется, ErrorMessage явно не задана в ModelError, связанной с ModelState, для плохого значения, но вместо этого устанавливается свойство Exception. В соответствии с кодом из MVC ValidationExtensions, следующий код используется для извлечения текста ошибки:

string errorText = GetUserErrorMessageOrDefault(htmlHelper.ViewContext.HttpContext, modelError, null /* modelState */); 

Уведомление передается нулевой параметр для ModelState. Метод GetUserErrorMEssageOrDefault затем начинается так:

private static string GetUserErrorMessageOrDefault(HttpContextBase httpContext, ModelError error, ModelState modelState) { 
    if (!String.IsNullOrEmpty(error.ErrorMessage)) { 
     return error.ErrorMessage; 
    } 
    if (modelState == null) { 
     return null; 
    } 

    // Remaining code to fetch displayed string value... 
} 

Таким образом, если свойство ModelError.ErrorMessage пусто (который я проверил, что при попытке установить не целое значение объявленной межд), MVC продолжается для проверки ModelState, который мы уже обнаружили, является нулевым, поэтому null для любого Exception ModelError. Таким образом, на данный момент, мои 2 лучшие работы вокруг идеи по этому вопросу являются:

  1. Создание пользовательского расширения Validation, который правильно возвращает соответствующее сообщение, когда ErrorMessage не установлен, но Exception устанавливается.
  2. Создайте функцию предварительной обработки, которая вызывается в контроллере, если ModelState.IsValid возвращает значение false. Функция предварительной обработки будет искать значения в ModelState, где ErrorMessage не задана, но значение Exception установлено, а затем выводится соответствующее сообщение с использованием ModelState.Value.AttemptedValue.

Любые другие идеи?

+1

Я пришел к этому самому осознанию, но через небольшое испытание и ошибку. Ваш №2 примерно то, что мне пришлось сделать. – Funka

+0

Знаете ли вы, есть ли способ сделать это в MVC3? Я собираюсь создать глобальный фильтр действий, который копирует из моего исключения в свойство ErrorMessage, но кажется странным, что я должен буду! – mcintyre321

Смежные вопросы