1

モデルを作成したい:

public class TestModel
{
    Microdata(Data = "data-test=this is a test!")]
    public bool Test { get; set; }
}

次に、ビューで:

@Html.DisplayForModel()

私が探している結果は次のようなものです:

<label>Test:</label> <input type="checkbox" data-test="this is a test!" />

すでにカスタム属性クラスを作成しましたが、何も生成されませんでした。

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public class MicrodataAttribute : Attribute
{
    public string Data { get; set; }

    public RouteValueDictionary GetAttributes()
    {
        var attributes = new RouteValueDictionary();

        if (this.Data != null)
        {
            string[] kv = this.Data.Split(',');
            attributes.Add(kv[0], kv[1]);
        }
        return attributes;
    }
}



public class MetadataProvider : DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
    {
        var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
        var additionalValues = attributes.OfType<HtmlPropertiesAttribute>().FirstOrDefault();
        if (additionalValues != null)
        {
            metadata.AdditionalValues.Add("HtmlAttributes", additionalValues);
        }
        return metadata;
    }
}
4

2 に答える 2

2

なぜでしょうか?あなたの属性を使用するコードはありません...

以下のブログ記事を読んでください - MVC がメタデータを使用する方法と、object作成する必要があるカスタム テンプレートの例が説明されています。

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html

于 2012-04-09T22:53:44.887 に答える
0

@JakubKonecki とこの問題について話し合い、彼が提示したブログ投稿を読んだ後。これは、MVC 2/3 およびおそらく 4 でデータ ダッシュ属性を作成するために使用される EditTemplate です。

このファイルを root/Views/Shared/EditTemplates の下に String.cshtml として保存しました。cshtml は、かみそりエンジンを使用しているためです。エリアを使用していて、「共有」ビュー フォルダーに保存する必要がない場合、場所は異なる場合があります。Brad Wilson が投稿した @JakubKonecki のブログ全体を読んでください。

ありがとう@JakubKonecki!

@{
    Dictionary<string, object> AV = ViewData.ModelMetadata.AdditionalValues;
    Dictionary<string, object> htmlAttr = new Dictionary<string,object>();
    foreach (KeyValuePair<string, object> A in AV)
    {
        if (A.Value is System.Web.Routing.RouteValueDictionary)
        {
            foreach (KeyValuePair<string, object> B in (System.Web.Routing.RouteValueDictionary)A.Value)
            {
                htmlAttr.Add(B.Key, B.Value);
            }
        }
    }
    htmlAttr.Add("class", "text-box single-line");
    htmlAttr.Add("type", "text");
}

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, htmlAttr)
于 2012-04-11T21:41:39.940 に答える