3

我在 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" />
4

2 回答 2

8

你上面的例子对我来说很好。我想知道 - 这是一个精确的例子,还是从现实世界的问题简化而来?在使用具有嵌套属性的模型时,我发现了这种确切的行为。

因此,例如,如果我将您的模型更改为如下所示:

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

于 2011-07-10T18:57:16.113 回答
0

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

我在 CodePlex 上报告的错误中附加了此代码的更开发版本(它提供了所有TextAreaFor重载,包括带有的重载) 。htmlAttributes

于 2012-03-16T17:12:04.073 回答