2012-02-09 6 views
3

私が取り組んでいるウェブサイトに控えめなカスケードドロップダウンシステムを作成したいと思っています。カスタムHtml属性をレンダリングされたタグに含めるために、さまざまなHtmlHelperメソッドを取得する方法を調べるのに問題があります。MVC3にビューモデルアトリビュートを通じてdata- *アトリビュートを追加する

組み込みのHtmlHelperメソッドのソースを調べると、すべてGetUnobtrusiveValidationAttributesが呼び出され、すべてのdata-val- * html属性が作成されます。バリデータの属性が必要な場合は素晴らしいですが、テンプレートを変更したり、新しいHtmlHelper拡張を作成したりすることなく、このように他の属性を追加できるようにしたいと考えています。

これはすべて可能ですか?私は何か見落としていますか?

編集

私はすべてのHtmlHelperのメソッドは、HTML属性を持つオブジェクトを受け入れるオーバーロードを持っていることを知っています。私は可能な限りこれを避けようとしています。

編集2

私は基本的にこの現象が発生します:

public class ViewModel 
{ 
    [Cascading(Action="/Controller/Action")] 
    public int Action { get; set; } 
} 

そしてHtmlHelpersは次のように出てレンダリングしています:アップ記述することなく、

<select data-action="/Controller/Action"></select> 

しかし、できれそれを行う拡張メソッド。私は自分のヘルパーメソッドを作成するのに問題はありませんが、既にランダムなモデルのメタデータを見て、html属性を追加できる組み込み機能が不足しているのだろうかと思います。

答えて

2

edit 1 + 2を見て、自分の拡張機能を作成する必要があると思います。あなたはdealing with dropdownsなので、have a look at this implementationでもuse custom attributes via IMetadataAwareとすることができます。

IMetadataAware:属性は、カスタムメタデータプロバイダを記述することなく、モデルのメタデータの作成プロセスにメタデータを追加できるように、このインタフェースは、属性クラスによって実装することができます。このインタフェースはAssociatedMetadataProviderクラスによって消費されるため、この動作はDataAnnotationsModelMetadataProviderクラスなど、派生するすべてのクラスによって継承されます。カスタムは、生成されたHTMLに属性を追加したい場合は、あなたが、たとえば、多くのヘルパーで利用できるObject htmlAttributesパラメータを使用することができます


この部分は答えとして、もはや有益ではありません@Html.ActionLink()

カスタムdata-*の例では、javascript対応クライアントでユーザー設定を編集するためのモーダルダイアログを目立たないように開始するために使用される可能性があります。 Bootstrap's modalはこれに類似した何かを使用します。

私はusing underscores instead of dashes for the data attributeです。あなたのケースでは

@Html.ActionLink(
    "Settings", 
    "CreateOrUpdate", 
    "User", 
    new { id = "1234" }, 
    new { 
     title = "Edit your personal settings", 
     data_show_modal = "#my-user-settings-modal" 
    }) 

、私はあなたにもhtmlAttributesを取る@Html.DropDownList(...)を使用していると思います。あなたの好きなようにそれらを移入し、あなたのjavascriptが右のdata-*属性をピックアップさせる。

public static MvcHtmlString DropDownList(
    this HtmlHelper htmlHelper, 
    string name, 
    IEnumerable<SelectListItem> selectList, 
    string optionLabel, 
    Object htmlAttributes 
) 
+0

ありがとう、私はこれらの値を手動で追加する必要はありません。私は作成しているビューモデルの属性からhtml属性を取得します。 – rossisdead

+0

ああ、タイトルにその部分を忘れていたに違いない。 –

+0

心配することなく、誰かが同じ回答を投稿してから削除しました。私は少し明確にするために私の質問を更新しました。 – rossisdead

0

エディタ/ディスプレイテンプレートまたはHtmlAttributesを使用せずに行うことはできません。

テンプレートには、タグを1か所に簡単に追加し、アプリケーション全体に伝播させるという利点があります。

0

私は昨日について学んだ素晴らしいIMetadataAwareインタフェースで、エディタのテンプレートにビューモデルからプロパティを提供するためにUIHint派生属性を使用します。

基本コンストラクタへの呼び出しが、実際にパラメータとして実際のヘルパーに属性を追加するために書いたエディタテンプレートの名前を強制する方法に注意してください。 UIHintパラメータに渡されたKnownUiHints.SelectionOther定数は、エディタテンプレートの名前である "SelectionOtherInput"に等しくなります。

ヘルパー・パラメータはヘルパー・コードで使用できます。

など。私DropDownAttributeは、次のコードでプロパティを伝える:

public class SelectionOtherInputAttribute : UIHintAttribute, IMetadataAware 
{ 
    public SelectionOtherInputAttribute(string selectionElementName) : base(KnownUiHints.SelectionOther, KnownPresentationLayers.Mvc) 
    { 
     SelectionElementName = selectionElementName; 
    } 
    public SelectionOtherInputAttribute(string selectionElementName, object otherSelectionKey) : base(KnownUiHints.SelectionOther, KnownPresentationLayers.Mvc) 
    { 
     SelectionElementName = selectionElementName; 
     ControlParameters[SelectionOtherInputControlParameterKeys.OtherSelectionKey] = otherSelectionKey; 
    } 
    public string SelectionElementName { get; set; } 
    public object OtherSelectionKey { get; set; } 
    public void OnMetadataCreated(ModelMetadata metadata) 
    { 
     metadata.AdditionalValues["@OtherSelectionAttrinbuteNames.SelectionElementName"] = SelectionElementName; 
     metadata.AdditionalValues["@OtherSelectionAttrinbuteNames.OtherSelectionKey"] = OtherSelectionKey; 
    } 
} 

はここに私のSelectionOtherInputエディタテンプレートです。次のように

@using OtherInput.Core 
@{ 
    var meta = ViewData.ModelMetadata.AdditionalValues; 
    var selectionElementName = (string)meta["@OtherSelectionAttrinbuteNames.SelectionElementName"]; 
    var otherSelectionKey = meta["@OtherSelectionAttrinbuteNames.OtherSelectionKey"]; 
    var inputElementname = ViewData.TemplateInfo.HtmlFieldPrefix; 
} 
@Html.SelectionOtherTextBoxFor(m => Model, selectionElementName, otherSelectionKey.ToString()) 

それから私は、ビューモデルで私の属性を使用します。

[SelectionOtherInput("EmploymentStatusId", 1)] 
public string OtherEmploymentStatus { get; set; } 

これは、として渡された属性と、ターンで私SelectionOtherTextBoxForヘルパーをレンダリングSelectionOtherInputエディタテンプレートによってレンダリングされるOtherEmploymentStatusを引き起こし議論

関連する問題