Разница валидации на стороне клиента между Html.TextBoxFor / Html.TextAreaFor и Html.EditorFor (с [DataType (DataType.MultilineText)]) - PullRequest
3 голосов
/ 21 июня 2011

Я использую проверку на стороне клиента (ненавязчиво) в ASP.NET MVC 3 / Razor, и я заставил ее работать на <textarea>, используя Html.EditorFor и указав DataType.MultilineText, но не должен также Html.TextAreaFor.есть проверка на стороне клиента?

[Required(ErrorMessage = "Foo")]
public string Message { get; set; }

// Does add client-side validation
@Html.TextBoxFor(m => m.Message)

// Does NOT add client-side validation
@Html.TextAreaFor(m => m.Message)

[Required(ErrorMessage = "Foo")]
[DataType(DataType.MultilineText)]
public string Message { get; set; }

// Does add client-side validation (and multiline)
@Html.EditorFor(m => m.Message)

// Does NOT add client-side validation
@Html.TextAreaFor(m => m.Message)

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

Ответы [ 2 ]

8 голосов
/ 10 июля 2011

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

Так, например, если я изменю вашу модель, чтобы она выглядела следующим образом:

public class MyModelObject
{
    [Required(ErrorMessage = "Foo")]
    [DataType(DataType.MultilineText)]
    public string Message { get; set; }
}

public class MyModel
{
    public MyModelObject MyObject { get; set; }
}

Тогда я воспроизвожу именно ту проблему, которую вы упомянули.

@Html.EditorFor(x => x.MyObject.Message)

генерирует атрибуты проверки jquery, как и ожидалось:

<textarea class="text-box multi-line input-validation-error" data-val="true" data-val-required="Foo" id="MyObject_Message" name="MyObject.Message"></textarea>

Но это:

@Html.TextAreaFor(x => x.MyObject.Message)

Не:

<textarea cols="20" id="MyObject_Message" name="MyObject.Message" rows="2"></textarea>

Если это действительно описывает вашу проблему, похоже, что это было сообщено как ошибка: http://aspnet.codeplex.com/workitem/8576

0 голосов
/ 16 марта 2012

Как obliojoe предложил в своем ответе, эта ошибка появляется, когда выражение является более сложным, чем простая ссылка на свойство.

Я реализовал вспомогательные помощники, которые обходят эту проблему.Хитрость заключается в том, чтобы получить правильные метаданные модели, передать их HtmlHelper.GetUnobtrusiveValidationAttributes(), а затем передать полученные атрибуты оригинальному TextAreaFor() помощнику:

public static MvcHtmlString TextAreaWithValidationFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
{
    var modelMetadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
    var name = ExpressionHelper.GetExpressionText(expression);
    IDictionary<string, object> validationAttributes = helper.GetUnobtrusiveValidationAttributes(name, modelMetadata);
    return TextAreaExtensions.TextAreaFor(helper, expression, validationAttributes);
}

Я прикрепил более развитую версию (которая предоставляет все TextAreaFor перегрузки, в том числе с htmlAttributes) этого кода, на ошибку , сообщенную в CodePlex .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...