2011-09-10 42 views
3

我已經做了一個額外的參數標籤擴展,但是當我使用ViewData.ModelMetadata.DisplayName我沒有從我的模型上的Diaplsy屬性顯示名稱?從模型元數據解析元數據顯示名稱?

我的模型有這樣

[Display(Name = "User name")] 
    public string UserName { get; set; } 

一個用戶名,並使用類似這樣的

@Html.LabelFor(m => m.SetupModel.UserName, @<span>No fancy characters mmkay?</span>) 

與此HTML幫助

public static MvcHtmlString LabelFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> ex, Func<object, HelperResult> template, string labelText = null) { 
     var htmlFieldName = ExpressionHelper.GetExpressionText(ex); 
     var metadata = htmlHelper.ViewData.ModelMetadata; 
     string resolvedLabelText = labelText ?? metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last(); 
     if (String.IsNullOrEmpty(resolvedLabelText)) { 
      return MvcHtmlString.Empty; 
     } 

     var tag = new TagBuilder("label"); 
     tag.Attributes.Add("for", TagBuilder.CreateSanitizedId(htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName))); 
     tag.InnerHtml = string.Format(
      "{0} {1}", 
      resolvedLabelText, 
      template(null).ToHtmlString() 
     ); 
     return MvcHtmlString.Create(tag.ToString()); 
    } 

但結果是UserNameNo看中字符mmkay?當我認爲它應該顯示在顯示屬性中設置的名稱?

回答

8

我錯過了當我發佈我以前的答案時,您的viewmodel中有不同的對象。以下只是爲了說明這個想法,應該有更好的方法來做到這一點。

這是招:

var metadata = ModelMetadata.FromLambdaExpression(ex, htmlHelper.ViewData); 
var resolvedLabelText = labelText ?? metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last(); 

string resolvedLabelText = ""; 
if (htmlFieldName.Contains('.')) 
{ 
    var model = htmlFieldName.Split('.'); 

    var metadata = htmlHelper.ViewData.ModelMetadata.Properties.FirstOrDefault(p => p.PropertyName == model[0]); 
    if (metadata != null) 
    { 
     metadata = metadata.Properties.FirstOrDefault(p => p.PropertyName == model[1]); 
     resolvedLabelText = labelText ?? metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last(); 
    } 
    else 
     resolvedLabelText = labelText ?? metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last(); 
} 
else 
{ 
    var metadata = htmlHelper.ViewData.ModelMetadata.Properties.First(p => p.PropertyName == htmlFieldName); 
    resolvedLabelText = labelText ?? metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last(); 
} 

以上不會爲 SomeObject.SomeObject.Propery例如工作。

+0

我得到一個序列中沒有匹配的元素異常,因爲我在這個視圖中使用的模型是含有配置模型和RegisterModel型SetupViewModel的。建議的代碼查詢的屬性名稱爲「SetupModel.UserName」。 public class SetupViewModel public Configuration.Configuration Configuration {get;組; } public RegisterModel SetupModel {get;組; } } – Marcus

+0

我更新了我的答案,只是爲了讓你走上正軌,它會在你的榜樣中起作用,但就是這樣。元數據是嵌套的,所以說... –

+0

謝謝,這是做的伎倆。正如你所說,感覺好像有一個更好的方法來做到這一點,所以它也適用於任何財產。 – Marcus

4

萬一在MVC4它很簡單

@ViewData.ModelMetadata.PropertyName 
@ViewData.ModelMetadata.DisplayName