2012-03-13 32 views
36

Tôi đã sử dụng biên tập Templates trong quá khứ như thế này, bằng cách áp dụng các chú thích dữ liệu sau:ASP.NET MVC biên tập Templates/UIHint với các thông số

[UIHint("SomeTemplate")] 

ViewModel:

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; } 
} 

Nếu tôi muốn sử dụng điều khiển bộ chọn ngày cụ thể thay vì điều khiển bộ chọn ngày thông thường, nó có thể được triển khai như sau.

Ví dụ:

Đối với các trường ID của tôi, tôi muốn tận dụng các thành phần tự động hoàn tất jQuery.

Câu hỏi:

Làm thế nào tôi sẽ đi về qua các tham số bổ sung cho quan điểm UIHint một phần cho LabSampleTypeIDLabSampleDetailID? (Như Id muốn có một biên tập mẫu tự động hoàn tất mà sẽ đưa một URL và sở hữu tên ví dụ)

Những gì tôi nghĩ tự động hoàn tất biên tập Template của tôi/phần sẽ giống như thế:

$(".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

FYI, bạn không cần UIHint cho DateTime. It's * already * một DateTime, vì vậy nó sẽ sử dụng một mẫu DateTime.cshtml nếu nó tồn tại. Bạn cần nó cho những cái khác không cùng loại với tên mẫu. –

Trả lời

68

Bạn có thể sử dụng AdditionalMetadata thuộc tính:

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

và trong mẫu:

@ViewData.ModelMetadata.AdditionalValues["foo"] 

vì vậy nếu bạn muốn vượt qua một url:

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

và trong mẫu của bạn:

@{ 
    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

Lớp 'UHint' có hàm tạo với tham số' params object [] controlParameters' bổ sung. mục đích của việc này là gì? –

+0

'UHint' controlParameters dường như có nhiều khả năng hơn cho số này – Sel

3

Bạn có thể sử dụng UHint mà không AdditionalMetadata thuộc tính, nhưng một số mã bổ sung được requred

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

ghi đè 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; 
     } 

Đăng ký CustomMetadataProvider:

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

và trong mẫu của bạn:

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

Xin chào, tôi đã thử mã của bạn nhưng khi cố đăng ký nhà cung cấp tùy chỉnh, nó không thể chuyển đổi loại mục tiêu thành System.Web.Mvc.ModelMetadataProvider, bất kỳ ý tưởng nào? –

+0

Ghi đè mà chúng tôi đã tạo đang mở rộng từ 'DataAnnotationsModelMetadataProvider' giống như ví dụ của bạn, nhưng 'ModelMetadataProviders.Current' đang mong đợi một ModelMetadataProvider. –

+0

** Ciaran **, đảm bảo bạn ghi đè 'DataAnnotationsModelMetadataProvider' từ không gian tên' System.Web.Mvc', không phải 'System.Web.Http.Metadata.Providers' – Sel

Các vấn đề liên quan