2009-02-17 8 views
4

J'essaie juste de faire une validation simple dans MVC RC et je reçois une erreur. Pour les besoins de cette question, je suis n'utilisant pas le UpdateModel.MVC RC Validation: Est-ce vrai?

Voici le code sous la forme:

<%= Html.TextBox("UserId")%> 
<%= Html.ValidationMessage("UserId") %> 

Si j'ajoute la ligne suivante dans le contrôleur, je vais obtenir un NullReferenceException sur la zone de texte:

ModelState.AddModelError("UserId", "*"); 

Donc, pour résoudre ce problème, J'ai également ajouté la ligne suivante:

ModelState.SetModelValue("UserId", ValueProvider["UserId"]); 

Pourquoi dois-je redéfinir la valeur? Je dois seulement faire ceci si j'ajoute l'erreur, mais il semble que je ne devrais pas avoir à faire ceci. J'ai l'impression que je fais quelque chose de mal ou que je ne suis pas assez familier avec la reliure.

On dirait que je ne suis pas le seul à avoir vu ça. Par demande, voici le code du contrôleur:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(FormCollection collection) 
    { 
     AppUser newUser = new AppUser(); 

     try 
     { 
      newUser.UserId = collection["UserId"]; 

      AppUserDAL.AddUser(newUser); 

      return RedirectToAction("Index"); 
     } 
     catch (Exception ex) 
     { 
      ViewData["ReturnMessage"] = ex.Message; 

      ModelState.AddModelError("UserId", "*"); 
      ModelState.SetModelValue("UserId", ValueProvider["UserId"]); 


      return View(newUser); 
     } 
+0

I J'ai aussi remarqué cela et je l'ai juste écrit comme quelque chose que j'ai mal fait et continué avec d'autres travaux. –

+0

Pourriez-vous s'il vous plaît ajouter un code de page complet et de la méthode du contrôleur? – zihotki

Répondre

4

appel cette méthode d'extension:

 public static void AddModelError (this ModelStateDictionary modelState, string key, string errorMessage, string attemptedValue) { 
     modelState.AddModelError (key, errorMessage); 
     modelState.SetModelValue (key, new ValueProviderResult (attemptedValue, attemptedValue, null)); 
    } 

De: Issues with AddModelError()/SetModelValue with MVC RC1

+0

Ok, il semble que ce soit un problème avec RC1. Cela va fonctionner, même si cela semble un peu lourd. Merci pour la réponse. –

+0

nous verrons si cela est corrigé dans la version 1.0 –

0

Vous n'avez absolument pas besoin d'appeler SetModelValue.

Peut-être avez-vous simplement besoin de votre vue pour extraire la zone de texte du modèle que vous avez transmis?

<%= Html.TextBox("UserId", Model.UserId)%> 

Voilà comment je le fais.

+0

J'ai essayé ceci et il ne semble pas fonctionner non plus. Ce qui est étrange, c'est que quand je souris sur la ligne de code dans la vue qui casse, l'objet Model n'est pas nul et je peux voir toutes les valeurs. –

0

Vous pouvez essayer cette extension pour définir la valeur de modèle avec une expression lambda:

/// <summary> 
    /// Sets model value. 
    /// </summary> 
    /// <typeparam name="TViewModel">The type of the view model.</typeparam> 
    /// <typeparam name="TProperty">The type of the property</typeparam> 
    /// <param name="me">Me.</param> 
    /// <param name="lambdaExpression">The lambda expression.</param> 
    ///<param name="value">New Value</param> 
    public static void SetModelValue<TViewModel, TProperty>(
     this ModelStateDictionary me, 
     Expression<Func<TViewModel, TProperty>> lambdaExpression, 
     object value) 
    { 

     string key = WebControlsExtensions.GetIdFor<TViewModel, TProperty>(lambdaExpression, "."); 

     if (!string.IsNullOrWhiteSpace(key)) 
     { 
      me.SetModelValue(key, new ValueProviderResult(value, String.Empty, System.Globalization.CultureInfo.InvariantCulture)); 
     } 
    } 

Pour obtenir l'ID:

public static class WebControlsExtensions 
{ 

    /// <summary> 
    /// Devuelve el Id correspondiente a la expresión lambda pasada por parámetro reemplazando los caracteres inválidos por la cadena pasada por parámetro 
    /// </summary> 
    /// <typeparam name="TViewModel">El tipo del modelo</typeparam> 
    /// <typeparam name="TProperty">El tipo de la propiedad</typeparam> 
    /// <param name="expression">Expresión lambda</param> 
    /// <param name="invalidCharReplacement">Cadena de texto que reemplaza a los carácteres inválido</param> 
    /// <remarks> 
    /// Valid characters consist of letters, numbers, and the hyphen ("-"), underscore ("_"), and colon (":") characters. 
    /// All other characters are considered invalid. Each invalid character in originalId is replaced with the character specified in the HtmlHelper.IdAttributeDotReplacement property. 
    /// </remarks> 
    /// <returns> Devuelve el Id correspondiente a la expresión lambda</returns> 
    public static string GetIdFor<TModel, TProperty>(Expression<Func<TModel, TProperty>> expression, string invalidCharReplacement) 
    { 
     return TagBuilder.CreateSanitizedId(ExpressionHelper.GetExpressionText(expression), invalidCharReplacement); 
    } 

}