MVC RC convalida: è questo diritto?
-
05-09-2019 - |
Domanda
Sto solo cercando di fare qualche semplice validazione in MVC RC e sto ottenendo un errore. Ai fini di questa domanda, io sono non si usa l'UpdateModel .
Ecco il codice nella forma:
<%= Html.TextBox("UserId")%>
<%= Html.ValidationMessage("UserId") %>
Se posso aggiungere la seguente riga nel controller, mi metterò un NullReferenceException sul TextBox:
ModelState.AddModelError("UserId", "*");
Quindi, per risolvere questo problema, ho anche aggiunto la seguente riga:
ModelState.SetModelValue("UserId", ValueProvider["UserId"]);
Perché ho per associare nuovamente il valore? Ho solo fare questo se aggiungo l'errore , ma sembra che non avrei dovuto farlo. Mi sento come sto facendo qualcosa di sbagliato o semplicemente non hanno familiarità sufficiente con il legame.
Sembra che Im non l'unico che ha visto questo. Per ogni richiesta, ecco il codice di controllo:
[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);
}
Soluzione
Chiama questo metodo di estensione:
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));
}
Da: Problemi con AddModelError () / SetModelValue con MVC RC1
Altri suggerimenti
Sicuramente non c'è bisogno di chiamare SetModelValue.
Forse basta ingrandire l'immagine per tirare la Casella di testo dal modello che avete passato in?
<%= Html.TextBox("UserId", Model.UserId)%>
Ecco come lo faccio.
Si può provare questa estensione per impostare il valore modello con un'espressione 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));
}
}
Per ottenere 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);
}
}