2011-10-01 9 views
5

का उपयोग कर एकल पृष्ठ डिज़ाइन मेरे पास एक क्लाइंट है जो अपनी साइट के लिए एक पृष्ठ डिज़ाइन चाहता है जहां प्रत्येक "पृष्ठ" की सामग्री जावास्क्रिप्ट का उपयोग करके दिखाया/छिपा हुआ है क्योंकि उपयोगकर्ता साइट पर नेविगेट करता है।ऑर्चर्ड सीएमएस

मुझे ऑर्चर्ड का उपयोग करके इस तक पहुंचने का सबसे अच्छा तरीका नहीं है। एक विकल्प सामग्री को एक ही पृष्ठ सामग्री आइटम पर रखना होगा, लेकिन फिर आप ऑर्चर्ड की नेविगेशन सुविधाओं का उपयोग करने की क्षमता खो देंगे और क्लाइंट को पृष्ठों के संदर्भ में प्रशासन के बारे में सोचने नहीं दे सकते।

क्या किसी के पास ऑर्चर्ड सीएमएस में इसे सर्वश्रेष्ठ तरीके से सेट करने के बारे में विचार या अनुभव हैं?


यहाँ समाधान मैं बर्ट्रेंड की सलाह के आधार पर किया जाता है:

public ActionResult Display(int id) 
{ 
    var contentItem = _contentManager.Get(id, VersionOptions.Published); 
    dynamic model = _contentManager.BuildDisplay(contentItem); 
    var ctx = _workContextAccessor.GetContext(); 
    ctx.Layout.Metadata.Alternates.Add("Layout_Null"); 
    return new ShapeResult(this, model); 
} 

मैं एक नियंत्रक के ऊपर कार्रवाई विधि युक्त के साथ एक नया मॉड्यूल बनाया। क्रिया विधि सामग्री भाग आईडी के लिए पैरामीटर लेता है। _contentManager और _workContextAccessor ऑब्जेक्ट्स को नियंत्रक में इंजेक्शन दिया जा रहा है। लेआउट.Null.cshtml व्यू बिल्कुल बनाया गया था जैसे बर्ट्रैंड ने सुझाव दिया था।

+0

यह एक बेहद विचित्र डिजाइन है जो एसईओ और सभी ज्ञात प्रयोज्यता के सामने उड़ने लगता है। क्या यह न्यायसंगत है? –

+0

ऐसा लगता है कि आप एक मोबाइल ऐप विकसित कर रहे हैं, है ना? jQuery मोबाइल? –

+0

@BertrandLeRoy: मैं जरूरी नहीं असहमत हूं।क्लाइंट चाहता है (विशेष रूप से वे चाहते हैं कि मैं इस टेम्पलेट को लागू करना चाहता हूं: http://udfrance.com/dev/STUDIO8/index_black.html)। साइट सामग्री पर बहुत हल्की है और एसईओ प्राथमिक उद्देश्य नहीं है। – joshb

उत्तर

8

एसईओ, ग्राहक प्रदर्शन और रखरखाव बलिदान के बिना इस तरह के बहुत पॉलिश अनुभव को प्राप्त करने के लिए मैं क्या करूँगा: अभी भी अपने स्वयं के यूआरएल के साथ पेजों, ब्लॉग पोस्ट इत्यादि के सेट के रूप में साइट को "क्लासिकल" बनाएं। यह होम पेज लेआउट है जो तब अलग होना चाहिए और अजाक्स कॉल का उपयोग करके उन अन्य पृष्ठों की सामग्री लाएं। एक विधि जिसे मैं एक नियमित सामग्री आइटम के रूप में एक ही सामग्री को प्रदर्शित करने के लिए उपयोग कर रहा हूं, लेकिन अजाक्स कॉल से (इसलिए सामग्री के चारों ओर क्रोम के बिना, स्टाइलशीट लाने के बिना, जैसा कि पहले से ही है, आदि) है एक अलग नियंत्रक कार्रवाई है कि एक "नल लेआउट" में सामग्री देता है:

@{ 
    Model.Metadata.Wrappers.Clear(); 
} 
@Display(Model.Content) 

क्लियरिंग:

var ctx = _workContextAccessor.GetContext(); 
ctx.Layout.Metadata.Alternates.Add("Layout_Null"); 
return new ShapeResult(this, shape); 

फिर, मुझे लगता है कि इस तरह दिखता है मेरे विचार में एक Layout.Null.cshtml फ़ाइल है wrappers document.cshtml से प्रतिपादन को हटा देता है, और टेम्पलेट स्वयं केवल एक जोन, सामग्री प्रस्तुत कर रहा है। तो क्या प्रदान किया जाता है केवल सामग्री है और कुछ भी नहीं। अजाक्स कॉल से इंजेक्ट करने के लिए आदर्श।

क्या इससे मदद मिलती है?

+0

यह एक अच्छा समाधान की तरह लगता है। "शून्य लेआउट" में सामग्री को वापस करने वाले नियंत्रक क्रिया कहां जाती है? – joshb

+0

जहां आप चाहते हैं: मॉड्यूल, विषय, इससे कोई फर्क नहीं पड़ता। –

+0

उत्तर के रूप में चिह्नित करें? –

2

बर्ट्रैंड के समाधान के साथ-साथ, क्या इसे फ़िल्टरप्रोवाइडर/आईरसल्टफिल्टर के रूप में लागू करने के लिए और अधिक समझदारी होगी? इस तरह हमें सामग्री पुनर्प्राप्ति तर्क को संभालने की आवश्यकता नहीं है। उदाहरण दिया गया है कि बर्ट्रेंड प्रदान की गई सूची सामग्री वस्तुओं के लिए काम नहीं कर रहा है।

public class LayoutFilter : FilterProvider, IResultFilter { 
    private readonly IWorkContextAccessor _wca; 

    public LayoutFilter(IWorkContextAccessor wca) { 
     _wca = wca; 
    } 

    public void OnResultExecuting(ResultExecutingContext filterContext) { 
     var workContext = _wca.GetContext(); 
     var routeValues = filterContext.RouteData.Values; 

     if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest()) { 
      workContext.Layout.Metadata.Alternates.Add("Layout_Null"); 

     }   
    } 

    public void OnResultExecuted(ResultExecutedContext filterContext) { 
    }   
} 
+0

हैलो राहुल की सहायता करें, मैं इसे अपने प्रोजेक्ट के लिए कार्यान्वित कर रहा हूं, लेकिन मैं पेज सामग्री को AJAX से कैसे प्राप्त करूं? धन्यवाद – tuanvt

+0

@tuanvt मेरी जांच करें उत्तर – parliament

2

जोड़ा कोड के साथ राहुल की जवाब पुनर्प्रयोग जवाब देने के लिए @ tuanvt के सवाल:

मैं अपने मॉड्यूल में कुछ इस तरह काम करने के लिए लगता है कि मिल गया है। मैं ईमानदारी से यह सुनिश्चित नहीं कर रहा हूं कि आपका प्रश्न क्या है, लेकिन ऐसा लगता है कि आप AJAX अनुरोध के साथ भेजे गए डेटा तक पहुंचना चाहते हैं। यदि यह JSON है, तो आप सेट सामग्री भेज रहे हैं टाइप: अनुरोध पर "एप्लिकेशन/जेसन", JSON.stringify(), फिर इसे अनुरोध स्ट्रीम से निकालने के द्वारा राहुल के प्रस्तावित एक्शनफ़िल्टर में इसे एक्सेस करें। उम्मीद है कि यह किसी भी तरह से मदद करता है।

public class LayoutFilter : FilterProvider, IResultFilter { 
    private readonly IWorkContextAccessor _wca; 

    public LayoutFilter(IWorkContextAccessor wca) { 
     _wca = wca; 
    } 

    public void OnResultExecuting(ResultExecutingContext filterContext) { 
     var workContext = _wca.GetContext(); 
     var routeValues = filterContext.RouteData.Values; 

     if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest()) { 
      workContext.Layout.Metadata.Alternates.Add("Layout_Null"); 

      if (filterContext.HttpContext.Request.ContentType.ToLower().Contains("application/json")) 
      { 
       var bytes = new byte[filterContext.HttpContext.Request.InputStream.Length]; 
       filterContext.HttpContext.Request.InputStream.Read(bytes, 0, bytes.Length); 
       filterContext.HttpContext.Request.InputStream.Position = 0; 
       var json = Encoding.UTF8.GetString(bytes); 
       var jsonObject = JObject.Parse(json); 
       // access jsonObject data from ajax request 
      } 
     }   
    } 

    public void OnResultExecuted(ResultExecutedContext filterContext) { 
    }   
}