2011-03-25 14 views
0

'.value'または.anythingという名前のフィールドは、クライアント検証を生成しません。たとえば、このコード:mvc3クライアントコードを生成しない邪魔にならない検証

<textarea rows="2" name="ContentObjectFirm.Description" id="ContentObjectFirm_Description" data-val-required="Firm description is required" data-val="true" cols="20"></textarea> 

通知 "データ-VAL-必要"

は今、私は "ContentObjectFirm.Description.Value" という名前のフィールドを持っている必要があります:

@Html.TextArea("ContentObjectFirm.Description") 

はこれを生成し - 私はここでカスタムバインダーを使用しています(ただし、私の質問には関係ありません)。結論は、フィールドの名前に「.Value」を付ける必要があるということです。だから、このコードの

:Html.TextArea( "ContentObjectFirm.Description.Value")@

テキストエリアのヘルパーが生成します。

<textarea rows="2" name="ContentObjectFirm.Description.Value" id="ContentObjectFirm_Description_Value" cols="20"></textarea> 

モデルクラスを:

[Required(ErrorMessageResourceName = "fld_Description_val_Required", ErrorMessageResourceType = typeof(Resources.Service.Controllers.Firm))] 
[Display(Name = "fld_Description_lbl", ResourceType = typeof(Resources.Service.Controllers.Firm))] 
public MultilanguageProperty<string> Description 
{ 
    get 
    { 
     return this.GetMultilanguageProperty("Description", string.Empty, this); 
    } 

    set 
    { 
     this.SetMultilanguageProperty("Description", value); 
    } 
} 

MultilanguagePropertyは私のカスタムインターフェースです(重要ではありません)。 'string Description'を使用すると、それでも機能しません。

控えめな検証コードが追加されるようにするにはどうすればよいですか? .value文字列を追加すると、なぜスキップされますか?

おかげ

+0

こんにちは、あなたは分析のためのモデルクラスを提供できますか? – tpeczek

答えて

1

デフォルトのHtmlHelperのは、あなたのモデルからメタデータとValidationAttributesを調べるために提供名を使用しています。名前がプロパティに対応していない場合、HtmlHelperはこれらの情報を検索しません。最善の解決策は、このように見えるかもしれカスタムHtmlHelperの拡張を作成しているようだ:

public static class CustomTextAreaExtensions 
{ 
    public static MvcHtmlString CustomNameTextArea(this HtmlHelper htmlHelper, string name, string metadataPropertyName) 
    { 
     string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); 

     TagBuilder tagBuilder = new TagBuilder("textarea"); 
     tagBuilder.GenerateId(fullName); 
     tagBuilder.MergeAttribute("rows", "2", true); 
     tagBuilder.MergeAttribute("cols", "20", true); 
     tagBuilder.MergeAttribute("name", fullName, true); 

     ModelState modelState; 
     if (htmlHelper.ViewData.ModelState.TryGetValue(fullName, out modelState) && modelState.Errors.Count > 0) 
      tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); 

     tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(metadataPropertyName)); 

     ModelMetadata modelMetadata = ModelMetadata.FromStringExpression(metadataPropertyName, htmlHelper.ViewContext.ViewData); 
     string value; 
     if (modelState != null && modelState.Value != null) 
      value = modelState.Value.AttemptedValue; 
     else if (modelMetadata.Model != null) 
      value = modelMetadata.Model.ToString(); 
     else 
      value = String.Empty; 
     tagBuilder.SetInnerText(Environment.NewLine + value); 

     return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal)); 
    } 
} 

web.configファイルに適切な名前空間を登録した後、あなたはこのように、この拡張メソッドを使用することができます:

@Html.CustomNameTextArea("ContentObjectFirm.Description.Value", "ContentObjectFirm.Description") 

これは、あなたに望ましい出力を与えるはずです。

+0

陽性:それは働いています:)ありがとう。私の場合、多言語のプロパティが使用するすべての型に対して1つずつ作成する必要があります:textbox、textarea :(。 – ShaneKm

関連する問題