2010-06-09 17 views
9

हम ऐसी साइट बना रहे हैं जिसमें बहुत कम कोड होगा, यह ज्यादातर बस स्थिर पृष्ठों का एक समूह बनने जा रहा है। मुझे पता है कि समय के साथ बदल जाएगा और हम अधिक गतिशील जानकारी में स्वैप करना चाहते हैं, इसलिए मैंने आगे बढ़ने और एएसपी.नेट एमवीसी 2 और स्पार्क व्यू इंजन का उपयोग करके एक वेब एप्लिकेशन बनाने का फैसला किया है। वहां कुछ नियंत्रक होंगे जिन्हें वास्तविक कार्य करना होगा (जैसे/उत्पादों के क्षेत्र में), लेकिन इनमें से अधिकांश स्थिर होंगे।नियंत्रक लिखने के बिना सरल एएसपी.नेट एमवीसी विचार

मैं चाहता हूं कि मेरा डिजाइनर मुझे साइट को बनाने और स्थानांतरित करने के लिए हर बार एक नया नियंत्रक या मार्ग लिखने के लिए कहने में सक्षम हो, जब भी वे पृष्ठ जोड़ने या स्थानांतरित करने का निर्णय लेते हैं। तो अगर वह एक "http://example.com/News" पृष्ठ जोड़ना चाहता है तो वह केवल दृश्यों के तहत एक "समाचार" फ़ोल्डर बना सकता है और इसके अंदर एक index.spark पेज डाल सकता है। उसके बाद यदि वह फैसला करता है कि वह एक/समाचार/सामुदायिक पृष्ठ चाहता है, तो वह उस समुदाय के भीतर एक समुदाय। स्पार्क फ़ाइल छोड़ सकता है और इसे काम कर सकता है।

मैं अपने नियंत्रकों को हैंडल अज्ञात एक्शन ओवरराइड करके एक विशिष्ट कार्रवाई के बिना एक दृश्य देखने में सक्षम हूं, लेकिन मुझे अभी भी इन फ़ोल्डरों में से प्रत्येक के लिए नियंत्रक बनाना है। यह मूर्खतापूर्ण लगता है कि जब भी वे साइट पर कोई क्षेत्र जोड़ने का निर्णय लेते हैं तो हर बार एक खाली नियंत्रक जोड़ना पड़ता है और फिर से संकलित होता है।

क्या यह आसान बनाने का कोई तरीका है, इसलिए मुझे केवल एक नियंत्रक लिखना होगा और वास्तविक तर्क होने पर पुन: संकलित करना होगा? कुछ प्रकार के "मास्टर" नियंत्रक जो किसी भी अनुरोध को संभाल लेंगे जहां कोई विशिष्ट नियंत्रक परिभाषित नहीं था?

+0

+1 हैंडल अज्ञात क्रिया का उल्लेख करने के लिए +1। इससे मुझे मदद मिली। –

उत्तर

6

आपको वास्तविक नियंत्रक/कार्यों के लिए रूट मैपिंग लिखनी होगी और सुनिश्चित करें कि डिफ़ॉल्ट में इंडेक्स के रूप में इंडेक्स है और आईडी "कैचॉल" है और यह यह करेगी!

public class MvcApplication : System.Web.HttpApplication { 
     public static void RegisterRoutes(RouteCollection routes) { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      routes.MapRoute(
       "Default", // Route name 
       "{controller}/{action}/{id}", // URL with parameters 
       new { controller = "Home", action = "Index", id = "catchall" } // Parameter defaults 
      ); 

     } 

     protected void Application_Start() { 
      AreaRegistration.RegisterAllAreas(); 

      RegisterRoutes(RouteTable.Routes); 

      ControllerBuilder.Current.SetControllerFactory(new CatchallControllerFactory()); 

     } 
    } 

public class CatchallController : Controller 
    { 

     public string PageName { get; set; } 

     // 
     // GET: /Catchall/ 

     public ActionResult Index() 
     { 
      return View(PageName); 
     } 

    } 

public class CatchallControllerFactory : IControllerFactory { 
     #region IControllerFactory Members 

     public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) { 

      if (requestContext.RouteData.Values["controller"].ToString() == "catchall") { 
       DefaultControllerFactory factory = new DefaultControllerFactory(); 
       return factory.CreateController(requestContext, controllerName); 
      } 
      else { 
       CatchallController controller = new CatchallController(); 
       controller.PageName = requestContext.RouteData.Values["action"].ToString(); 
       return controller; 
      } 

     } 

     public void ReleaseController(IController controller) { 
      if (controller is IDisposable) 
       ((IDisposable)controller).Dispose(); 
     } 

     #endregion 
    } 
+0

यह पूरी तरह से काम किया, धन्यवाद! –

1

क्या आप सभी स्थिर पृष्ठों के लिए एक अलग नियंत्रक नहीं बना सकते हैं और एमवीसी रूट्स का उपयोग करके सबकुछ (वास्तविक नियंत्रकों के अलावा) को रीडायरेक्ट कर सकते हैं, और पथ पैरामीटर शामिल कर सकते हैं? फिर उस नियंत्रक में आपको रूट द्वारा भेजे गए फ़ोल्डर/पथ पैरामीटर के आधार पर सही दृश्य प्रदर्शित करने के लिए तर्क हो सकता है।

हालांकि मुझे नहीं पता कि स्पार्क व्यू इंजन चीजों को संभालता है, क्या इसे विचारों को संकलित करना है? मुझे सच में यकीन नहीं है।

0

मुझे लगता है कि आप अपना स्वयं का नियंत्रक कारखाना बना सकते हैं जो हमेशा एक ही नियंत्रक वर्ग को तुरंत चालू करेगा।

1

पॉल के जवाब पर ध्यान देना। मैं किसी भी विशेष दृश्य इंजन का उपयोग नहीं कर रहा हूं, लेकिन मैं यह करता हूं:

1) PublicController.cs बनाएँ।

// GET: /Public/ 
[AllowAnonymous] 
public ActionResult Index(string name = "") 
{ 
    ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, name, null); 
    // check if view name requested is not found 
    if (result == null || result.View == null) 
    { 
     return new HttpNotFoundResult(); 
    } 
    // otherwise just return the view 
    return View(name); 
} 

2) फिर दृश्य फ़ोल्डर में एक सार्वजनिक निर्देशिका बनाएं, और अपने सभी विचारों को वहां रखें जहां आप सार्वजनिक होना चाहते हैं। मुझे व्यक्तिगत रूप से इसकी आवश्यकता थी क्योंकि मुझे कभी नहीं पता था कि क्या ग्राहक कोड को दोबारा बनाने के बिना और पेज बनाना चाहता था।

3) फिर सार्वजनिक/इंडेक्स कार्रवाई पर रीडायरेक्ट करने के लिए RouteConfig.cs को संशोधित करें।

routes.MapRoute(
    name: "Public", 
    url: "{name}.cshtml", // your name will be the name of the view in the Public folder 
    defaults: new { controller = "Public", action = "Index" } 
); 

4) तो बस अपने विचारों से इसे संदर्भ इस तरह:

<a href="@Url.RouteUrl("Public", new { name = "YourPublicPage" })">YourPublicPage</a> <!-- and this will point to Public/YourPublicPage.cshtml because of the routing we set up in step 3 --> 

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

3

यह link मदद हो सकता है,

आप दृश्य में cshtml \ लोक निर्देशिका बनाते हैं, तो यह एक ही नाम के साथ वेब साइट पर दिखाई देता होगा। मैंने 404 पेज भी जोड़ा।

[HandleError] 
    public class PublicController : Controller 
    { 
     protected override void HandleUnknownAction(string actionName) 
     { 
      try 
      { 
       this.View(actionName).ExecuteResult(this.ControllerContext); 
      } 
      catch 
      { 
       this.View("404").ExecuteResult(this.ControllerContext); 
      } 
     } 
    } 
संबंधित मुद्दे