Html.TextBoxFor/Html.TextAreaFor和Html.EditorFor(与[DataType(DataType.MultilineText)])之间的客户端验证差异

Joh*_*son 3 c# client-side-validation razor unobtrusive-validation asp.net-mvc-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)
Run Code Online (Sandbox Code Playgroud)
[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)
Run Code Online (Sandbox Code Playgroud)
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
Run Code Online (Sandbox Code Playgroud)

obl*_*joe 8

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

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

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

public class MyModel
{
    public MyModelObject MyObject { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我重现你提到的确切问题.

@Html.EditorFor(x => x.MyObject.Message)
Run Code Online (Sandbox Code Playgroud)

按预期生成jquery验证属性:

<textarea class="text-box multi-line input-validation-error" data-val="true" data-val-required="Foo" id="MyObject_Message" name="MyObject.Message"></textarea>
Run Code Online (Sandbox Code Playgroud)

但是这个:

@Html.TextAreaFor(x => x.MyObject.Message)
Run Code Online (Sandbox Code Playgroud)

才不是:

<textarea cols="20" id="MyObject_Message" name="MyObject.Message" rows="2"></textarea>
Run Code Online (Sandbox Code Playgroud)

如果这实际上描述了您的问题,看起来这已经被报告为一个错误:http: //aspnet.codeplex.com/workitem/8576