2011-03-18 18 views
11

Tengo un problema con la validación en ASP.NET MVC 2.0. Uso la misma acción en el controlador para realizar la solicitud del usuario.
Por ejemplo:Los mensajes de validación se muestran cuando carga la página

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

En el ReportModel, que definen un IsInitialDisplay indicador para determinar si la página se visualiza o no inicial:

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

    public ReportModel() 
    { 
     IsInitialDisplay = true; 
    } 
} 

Y en la vista, yo uso el siguiente código:

<% 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) %> 
<% } %> 

como espero, si los usuarios no introduce ningún valor para los Criterios y haga clic en botón Enviar, el mensaje de error para la validación será di extendido.
Pero el mensaje de error de validación siempre se muestra en la carga de la página inicial, no sé cómo prevenirlo?
¿Alguien sabe? Gracias,

[Actualizado]
He actualizado mi método de acción que a continuación y Es parecen estar bien:

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); 
} 

Respuesta

-1

Modelo

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

Ver

<% Html.EnableClientValidation(); %>  

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

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

Trabajo bien

+0

En mi proyecto, uso el objeto de modelo complejo para _ReportModel.Criteria_. Entonces, tu sugerencia no es adecuada. – aquanilium

32

El motivo por el que se muestra un mensaje de error en la carga de la página inicial es porque la acción de su controlador toma el modelo ReportModel como argumento. Cuando accede por primera vez a esta acción con /Home/Index no está pasando ningún argumento y cuando el archivador de modelo predeterminado intenta vincularse a una instancia ReportModel, desencadena errores de validación.

Es una mala práctica utilizar la misma acción tanto para la representación y gastos de envío del formulario, pero si realmente desea hacerlo usted podría tratar de esta manera:

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()); 
} 

En este caso ya no es necesario la propiedad IsInitialDisplay en su modelo ni el constructor que la establece en verdadero.

Dicho esto, aquí es la forma recomendada:

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); 
} 
+0

Gracias por su sugerencia, pero en mi proyecto, necesito recopilar algunos datos de commons para _ReportModel.Criteria_. Por lo tanto, no quiero duplicar esta lógica comercial en ambas acciones (con y sin modelo). – aquanilium

+0

me resulta curioso ya que recibo este error por el motivo que describió, pero la Acción acepta un modelo porque es parte de una serie de formularios y se PUBLICÓ en, y luego la página actual se publica en el siguiente. Así que no estoy seguro de por qué sería una mala práctica – BigOmega

+0

¿Por qué es una mala práctica "usar la misma acción para representar y manejar el formulario"? ¿Qué pasa? – SandRock

5

Aquí hay una solución simple que combina algunas buenas respuestas:

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

    return View(model); 
} 

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

Esto utiliza el método HTTP para determinar si se trata de la primera carga (como La solución de Darin).

Lo que es más importante, MVC ha creado su controlador en lugar de actualizar uno usted mismo. Esto es importante si usa la inyección de dependencia o si tiene otros datos contextuales entrando a través de la cadena de consulta (como una identificación de recurso anidado).

+0

gracias por eso – victor

Cuestiones relacionadas