2011-04-07 3 views
5

का उपयोग करके दिखाया गया है। मैं एएसपी.नेट एमवीसी और इसके सभी मजेदार उपयोगों पर पढ़ रहा हूं और मुझे अभी लगभग DataTemplates पता चला है।@ Html.EditForModel() से किसी फ़ील्ड को बाहर करने के लिए कैसे करें, लेकिन इसे HTML.DisplayForModel()

मेरी जल्दी इस बात का परीक्षण करने में, मैं @Html.DisplayForModel() और @Html.EditForModel() का उपयोग करने पर मेरे सरल मॉडलों में से एक परिवर्तित और यह एक भाग्यशाली आकर्षण की तरह काम किया है कि यह है :)

एक बात है कि मैं तुरंत हालांकि पता चला यह था कि मैं प्रदर्शन दृश्यों पर दिखाने के लिए आसानी से एक फ़ील्ड को परिभाषित नहीं कर सकता था लेकिन संपादन के लिए बिल्कुल मौजूद नहीं था ...

उत्तर

12

आप IMetadataAware इंटरफ़ेस का उपयोग करने के एक विशेषता है जो मेटाडाटा में ShowForEdit और ShowForDislay सेट हो जाएगा बना सकते हैं:

public class TemplateViewModel 
{ 
    [TemplatesVisibility(ShowForEdit = false)] 
    public string ShowForDisplayProperty { get; set; } 

    public string ShowAlwaysProperty { get; set; } 
} 

और यह:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] 
public class TemplatesVisibilityAttribute : Attribute, IMetadataAware 
{ 
    public bool ShowForDisplay { get; set; } 

    public bool ShowForEdit { get; set; } 

    public TemplatesVisibilityAttribut() 
    { 
     this.ShowForDisplay = true; 
     this.ShowForEdit = true; 
    } 

    public void OnMetadataCreated(ModelMetadata metadata) 
    { 
     if (metadata == null) 
     { 
      throw new ArgumentNullException("metadata"); 
     } 

     metadata.ShowForDisplay = this.ShowForDisplay; 
     metadata.ShowForEdit = this.ShowForEdit; 
    } 

} 

तो फिर तुम यह अपनी संपत्ति को इस तरह संलग्न कर सकते हैं आपको जो चाहिए वह यह है।

+0

शानदार सुरुचिपूर्ण :) मैं इस बाहर पहली बात कल की कोशिश कर रहा हो जाएगा सुबह। –

2

आप एक कस्टम मेटाडाटा प्रदाता लिख ​​सकते हैं और ShowForEdit मेटाडेटा संपत्ति सेट कर सकते हैं।

public class ShowForEditAttribute : Attribute 
{ 
    public ShowForEditAttribute(bool show) 
    { 
     Show = show; 
    } 

    public bool Show { get; private set; } 
} 

तो कस्टम मॉडल मेटाडाटा प्रदाता:

public class MyModelMetadataProvider : DataAnnotationsModelMetadataProvider 
{ 
    protected override ModelMetadata CreateMetadata(
     IEnumerable<Attribute> attributes, 
     Type containerType, 
     Func<object> modelAccessor, 
     Type modelType, 
     string propertyName 
    ) 
    { 
     var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName); 
     var sfea = attributes.OfType<ShowForEditAttribute>().FirstOrDefault(); 
     if (sfea != null) 
     { 
      metadata.ShowForEdit = sfea.Show; 
     } 
     return metadata; 
    } 
} 

तो इस प्रदाता Application_Start में रजिस्टर:

ModelMetadataProviders.Current = new MyModelMetadataProvider(); 

और अंत में सजाने: तो कस्टम विशेषता के साथ शुरू

public class MyViewModel 
{ 
    [ShowForEdit(false)] 
    public string Prop1 { get; set; } 

    public string Prop2 { get; set; } 
} 

अब आप अपने ध्यान में रखते हुए यदि आपके पास:

@model MyViewModel 

<h2>Editor</h2> 
@Html.EditorForModel() 

<h2>Display</h2> 
@Html.DisplayForModel() 

Prop1 संपत्ति संपादक टेम्पलेट में शामिल नहीं किया जाएगा।

टिप्पणी: आप ShowForDisplay मेटाडेटा संपत्ति के साथ ऐसा ही कर सकते हैं।

+0

मुझे लगता है कि समाधान tpeczek द्वारा प्रस्तावित और अधिक सुंदर है –

0

क्या आप उन सभी फ़ील्ड को प्रदर्शित कर सकते हैं जिन्हें आप HTML.DisplayTextbox या अन्य विकल्पों में से एक का उपयोग करना चाहते हैं? इस तरह आप फ़ील्ड का जिक्र करते हुए उपस्थिति और लेबल को भी अनुकूलित कर सकते हैं।

+1

नहीं वास्तव में - यह पूरी तरह से DisplayForModel और EditForModel तरीकों का उपयोग कर के पूरे मुद्दे कमजोर होता ... –

संबंधित मुद्दे

 संबंधित मुद्दे