2012-03-13 89 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