首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HtmlT.extBoxFor/HtmlT.extAreaFor与Html.EditorFor之间的客户端验证差异(有[DataType(DataType.MultilineText)])

HtmlT.extBoxFor/HtmlT.extAreaFor与Html.EditorFor之间的客户端验证差异(有[DataType(DataType.MultilineText)])
EN

Stack Overflow用户
提问于 2011-06-21 13:56:55
回答 2查看 7.6K关注 0票数 3

我在ASP.NET MVC 3/Razor中使用客户端验证(低调),我让它通过使用Html.EditorFor和指定DataType.MultilineText在<textarea>上工作,但是Html.TextAreaFor不应该也有客户端验证吗?

代码语言:javascript
复制
[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)
代码语言:javascript
复制
[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)
代码语言:javascript
复制
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
EN

回答 2

Stack Overflow用户

发布于 2011-07-10 18:57:16

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

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

代码语言:javascript
复制
public class MyModelObject
{
    [Required(ErrorMessage = "Foo")]
    [DataType(DataType.MultilineText)]
    public string Message { get; set; }
}

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

然后我重现你提到的问题。

代码语言:javascript
复制
@Html.EditorFor(x => x.MyObject.Message)

按预期生成jquery验证属性:

代码语言:javascript
复制
<textarea class="text-box multi-line input-validation-error" data-val="true" data-val-required="Foo" id="MyObject_Message" name="MyObject.Message"></textarea>

但是,这个:

代码语言:javascript
复制
@Html.TextAreaFor(x => x.MyObject.Message)

不:

代码语言:javascript
复制
<textarea cols="20" id="MyObject_Message" name="MyObject.Message" rows="2"></textarea>

如果这确实描述了您的问题,那么它似乎已经被报告为一个bug:http://aspnet.codeplex.com/workitem/8576

票数 8
EN

Stack Overflow用户

发布于 2012-03-16 17:12:04

正如遗忘了在他的回答中所建议的那样,当表达式比简单的属性引用更复杂时,就会出现这个错误。

我已经实施了替代帮助,以解决这一问题。诀窍是获取正确的模型元数据,将其传递给HtmlHelper.GetUnobtrusiveValidationAttributes(),然后将接收到的属性传递给原始的TextAreaFor()助手:

代码语言:javascript
复制
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重载,包括那些带有htmlAttributes的)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6426489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档