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

このコードのより開発されたバージョン ( をTextAreaFor含むすべてのオーバーロードを提供する) を、 CodePlex で報告されたバグに添付しました。htmlAttributes

于 2012-03-16T17:12:04.073 に答える