2012-03-13 147 views
36

我一直在使用編輯器模板,在過去像這樣被,通過應用下面的數據標註參數:ASP.NET MVC編輯模板/ UIHint與

[UIHint("SomeTemplate")] 

視圖模型:

public class MicroViewModel 
{ 
    public IEnumerable<LabMicro> Micros { get; set; } 

    [UIHint("DateTime")] 
    public DateTime Date { get; set; } 

    public int CaseNo { get; set; } 

    [UIHint("SampleTypes")] 
    public int LabSampleTypeID { get; set; } 

    [UIHint("SampleDetails")] 
    public int LabSampleDetailID { get; set; } 
} 

如果我想使用特定的日期選擇器控件而不是常規日期控件控件,它可以按如下方式實現。

例子:

對於我的ID字段,我想利用jQuery的自動完成組件的。

問:

我怎麼會去傳遞附加參數,爲LabSampleTypeIDLabSampleDetailIDUIHint局部視圖? (爲ID喜歡有一個自動完成編輯,模板將採取URL和屬性名爲例)

我覺得我的自動完成編輯,模板/部分應該是這樣的:

$(".auto").autocomplete({ 
    source: function(request, response) { 
     $.ajax({ 
      url: '[#URL_TO_USE]', 
      dataType: "json", 
      data: { 
       filter: request.term 
      }, 
      success: function(data) { 
       response($.map(eval(data), function(item) { 
        return { 
         label: item.[#PROPERTY_TO_USE] 
        } 
       })); 
      } 
     }) 
    } 
}); 
+2

僅供參考,您不需要UIHint的日期時間。它已經*了一個DateTime,所以它已經使用了一個DateTime.cshtml模板(如果它存在的話)。您確實需要它與模板名稱不同的其他類型。 – 2014-07-02 07:46:23

回答

68

您可以使用AdditionalMetadata屬性:

[UIHint("DateTime")] 
[AdditionalMetadata("foo", "bar")] 
public DateTime Date { get; set; } 

,並在模板:

@ViewData.ModelMetadata.AdditionalValues["foo"] 

所以,如果你想傳遞一個網址:

[UIHint("DateTime")] 
[AdditionalMetadata("controller", "somecontroller")] 
[AdditionalMetadata("action", "someaction")] 
[AdditionalMetadata("property", "someproperty")] 
public DateTime Date { get; set; } 

,並在您的模板:

@{ 
    var values = ViewData.ModelMetadata.AdditionalValues; 
} 

<script type="text/javascript"> 
$('.auto').autocomplete({ 
    source: function (request, response) { 
     $.ajax({ 
      url: '@Url.Action((string)values["action"], (string)values["controller"])', 
      dataType: "json", 
      data: { 
       filter: request.term 
      }, 
      success: function (data) { 
       response(
        $.map(eval(data), function (item) { 
         return { 
          label: item['@values["property"]'] 
         } 
        }) 
       ); 
      } 
     }); 
    }      
}); 
</script> 
+4

'UHint'類具有額外的'params對象[] controlParameters'的構造函數。這樣做的目的是什麼? – 2015-08-14 09:47:16

+0

UHint' controlParameters似乎更可適合這 – Sel 2016-11-24 12:24:54

3

您可以使用UHint沒有AdditionalMetadata屬性,但一些額外的代碼requred

[UIHint("DateTime", null, "key1", "value1", "key2", "value2")] 
public DateTime Date { get; set; } 

覆蓋CreateMetadata:

public class CustomMetadataProvider : DataAnnotationsModelMetadataProvider 
    { 
     public const string UiHintControlParameters = "UiHintControlParameters"; 

     protected override ModelMetadata CreateMetadata(
      IEnumerable<Attribute> attributes, 
      Type containerType, 
      Func<object> modelAccessor, 
      Type modelType, 
      string propertyName) 
     { 

      ModelMetadata metadata = base.CreateMetadata(
       attributes, 
       containerType, 
       modelAccessor, 
       modelType, 
       propertyName); 

      IEnumerable<UIHintAttribute> uiHintAttributes = attributes.OfType<UIHintAttribute>(); 
      UIHintAttribute uiHintAttribute = uiHintAttributes.FirstOrDefault(a => string.Equals(a.PresentationLayer, "MVC", StringComparison.OrdinalIgnoreCase)) 
               ?? uiHintAttributes.FirstOrDefault(a => String.IsNullOrEmpty(a.PresentationLayer)); 
      if (uiHintAttribute != null) 
      { 
       metadata.AdditionalValues.Add(UiHintControlParameters, uiHintAttribute.ControlParameters); 
      } 

      return metadata; 
     } 

註冊CustomMetadataProvider:

public static void Application_Start() 
    { 
     ModelMetadataProviders.Current = new CustomMetadataProvider(); 
    } 

,並在您的模板:

@{ 
     IDictionary<string, object> values = (IDictionary<string, object>) 
ViewData.ModelMetadata.AdditionalValues[CustomMetadataProvider.UiHintControlParameters]; 
    } 
+0

嗨我試過你的代碼,但試圖註冊自定義提供程序它說它無法將目標類型轉換爲System.Web.Mvc.ModelMetadataProvider,有什麼想法嗎? – 2017-01-04 16:00:21

+0

我們創建的覆蓋就像您的示例一樣從'DataAnnotationsModelMetadataProvider'擴展,但'ModelMetadataProviders.Current'期待ModelMetadataProvider。 – 2017-01-04 16:09:33

+0

** Ciaran **,您可以從'System.Web.Mvc'命名空間中覆蓋'DataAnnotationsModelMetadataProvider',而不是'System.Web.Http.Metadata.Providers' – Sel 2017-01-05 12:10:15