2010-07-20 2 views

ответ

2

Я не использовал его лично, но, глядя на MSDN, кажется, что это вопрос настройки DataType = DataType.Custom и CustomDataType = "String". Затем, когда вы обрабатываете свою модель, вы должны проверить DataType.Custom и, если нашли, выполнить разные операции на основе значения в CustomDataType.

Вот пример они дают на MSDN - How to: Customize Data Field Appearance and Behavior For Non-Intrinsic Data Types in the Data Model:

public partial class TextField : System.Web.DynamicData.FieldTemplateUserControl { 

    string getNavUrl() { 

     var metadata = MetadataAttributes.OfType<DataTypeAttribute>().FirstOrDefault(); 
     if (metadata == null) 
      return FieldValueString; 

     switch (metadata.DataType) { 

      case DataType.Url: 
       string url = FieldValueString; 
       if (url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || 
        url.StartsWith("https://", StringComparison.OrdinalIgnoreCase)) 
        return url; 

       return "http://" + FieldValueString; 


      case DataType.EmailAddress: 
       return "mailto:" + FieldValueString; 

      default: 
       throw new Exception("Unknown DataType"); 
     } 
    } 

    protected override void OnDataBinding(EventArgs e) { 
     base.OnDataBinding(e); 

     if (string.IsNullOrEmpty(FieldValueString)) 
      return; 

     var metadata = MetadataAttributes.OfType<DataTypeAttribute>().FirstOrDefault(); 

     if (metadata == null || string.IsNullOrEmpty(FieldValueString)) { 
      Literal literal = new Literal(); 
      literal.Text = FieldValueString; 
      Controls.Add(literal); 
      return; 
     } 

     if (metadata.DataType == DataType.Url || 
      metadata.DataType == DataType.EmailAddress) { 

      HyperLink hyperlink = new HyperLink(); 
      hyperlink.Text = FieldValueString; 
      hyperlink.NavigateUrl = getNavUrl(); 
      hyperlink.Target = "_blank"; 
      Controls.Add(hyperlink); 
      return; 
     } 

     if (metadata.DataType == DataType.Custom && 
      string.Compare(metadata.CustomDataType, "BoldRed", true) == 0) { 
      Label lbl = new Label(); 
      lbl.Text = FieldValueString; 
      lbl.Font.Bold = true; 
      lbl.ForeColor = System.Drawing.Color.Red; 
      Controls.Add(lbl); 
     } 

    } 

} 
2

Я прочитал над ASP.NET MVC серии 2 шаблона Брэда Уилсона в своем блоге here. Он объясняет, что вы просите лучше, чем я мог.

Надеюсь, что это поможет.

4

Не использовать DataType.Custom.

Вместо этого используйте [DataType("YourCustomDataTypeHere")] с шаблоном редактора/дисплея с именем YourCustomDataTypeHere.

+1

Чтобы немного расширить ответ MushinNoShin, создайте здесь новый файл: Views \ Shared \ DisplayTemplates \ YourCustomDataTypeHere.cshtml –

Смежные вопросы