MVC RC Validation: это правильно? - PullRequest
4 голосов
/ 18 февраля 2009

Я просто пытаюсь выполнить простую проверку в MVC RC и получаю сообщение об ошибке. Для целей этого вопроса я не использую UpdateModel .

Вот код в форме:

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

Если я добавлю следующую строку в контроллер, я получу исключение NullReferenceException для TextBox:

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

Итак, чтобы это исправить, я также добавил следующую строку:

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

Почему я должен перепривязать значение? Я должен сделать это, только если я добавлю ошибку , но, похоже, я не должен был это делать. Я чувствую, что делаю что-то неправильно или просто недостаточно знаком с привязкой.

Похоже, я не единственный, кто видел это. По запросу, вот код контроллера:

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

Ответы [ 3 ]

4 голосов
/ 12 марта 2009

Вызовите этот метод расширения:

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

От: Проблемы с AddModelError () / SetModelValue с MVC RC1

0 голосов
/ 22 октября 2012

Вы можете попробовать это расширение, чтобы установить значение модели с помощью лямбда-выражения:

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

Чтобы получить идентификатор:

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

}
0 голосов
/ 26 февраля 2009

Вам определенно не нужно вызывать SetModelValue.

Возможно, вам просто нужен ваш вид, чтобы вытащить текстовое поле из модели, в которой вы прошли?

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

Вот как я это делаю.

...