3

我閱讀Brad Wilson的文章之一的一個ModelMetadata:伸手到模型屬性

ASP.NET MVC 2個模板,第2部分:ModelMetadata

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

我們假設在我的ASP.NET MVC 3應用程序中,我有以下模型:

public class Contact { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int Age { get; set; } 
} 

這是我的觀點:

@model MyApp.Models.Contact 

<h2>Contact</h2> 

@Html.EditorForModel() 

,我有一個Contact.cshtml文件中~/Views/Shared/EditorTemplates/路徑。

我的問題是我如何能夠達到每個模型屬性ModelMetadata。例如,像下面:

Contact.cshtml

@model MyApp.Models.Contact 

<input type="text" placeholder="@Model.FirstName.GetItsMetaData().Watermark" 
     value="@Model.FirstName" /> 

注: GetItsMetaData方法是什麼,我完全是編造的。我只是想找到屬性的MedelMetadata。沒有 就是這樣。

編輯

我發現了另一個類似的問題:

ModelMetadata for complex type in editortemplate in asp.net mvc

,答案是這樣的:

@{ 
    var metadata = ModelMetadata 
     .FromLambdaExpression<TestThing, string>(x => x.Test2, ViewData); 
    var watermak = metadata.Watermark; 
} 

但它是非常詳細,爲做到這一點我的模型的每一個屬性,不是嗎?

+0

嗨tugberk,我只是想回答你的問題「*性能入門之間的差值(單位:

public static string WatermarkFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) { var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData); return metadata.Watermark; } 

你會在你的例子如下方式使用它)和Entity Framework 4.2的Entry(entity)*「,但同時你刪除了你的問題,哈哈。要點是:*當您調用Entry(實體)'(泛型類型推斷)時,編譯器*將選擇泛型重載。無論您是否指定通用參數,都會調用相同的方法。 (唯一的例外是,如果'entity'在編譯時是'object' *類型的*,那麼調用非泛型重載。)因爲編譯器調用相同的方法,所以沒有性能差異。 – Slauma

+0

@Slauma是的,他們認爲這個問題很愚蠢,我不想進入一個論點,所以我刪除了它。非常感謝! – tugberk

回答

4

創建HtmlHelper用於此目的不那麼冗長。助手應該是這樣的:

@model MyApp.Models.Contact 

<input type="text" placeholder="@Html.WatermarkFor(x => x.FirstName)" 
    value="@Model.FirstName" /> 
+0

好方法!仍然需要很多工作。這個'FromLambdaExpression'方法在幕後使用反射,對吧? – tugberk

+0

如果工作太多,那就用這個:@ Html.MagicallyGetWatermark():) – Dismissile

+0

@Dismissile不能說它讓我發癢。 – tugberk