2011-12-27 9 views
11

मुझे एक कन्वेंशन-संचालित स्थान से एक जेएस फ़ाइल की सामग्री लिखना होगा (जैसे ~/क्लाइंट ऐप/कंट्रोलर/होम/होम.जेएस ~/व्यू/होम/होम.cshtml पर स्थित दृश्य लोड करना)। मैं यह कैसे करु?सभी आंशिक विचारों पर एचटीएमएल/जेएस जोड़ने के लिए दृश्य प्रतिपादन को कैसे रोकें?

उदाहरण: फ़ाइल ~/दृश्य/होम/Home.cshtml की तरह लग रहा है, तो:

<div id="some-partial-view"> 
    <!-- ... --> 
</div> 

और फ़ाइल ~/ClientApp/नियंत्रकों/होम/Home.Controller.js लग रहा है

function HomeController() { 
    //some code 
} 
की तरह

तब वेब सर्वर द्वारा दिया गाया दृश्य कैसा दिखना चाहिए

<!--ommitted <html> <body> tags --> 

<div id="some-partial-view"> 
    <!-- ... --> 
</div> 

<script type="text/javascript"> 
    function HomeController() { 
     //some code 
    } 
</script> 

एक तरह से जोड़ने के लिए है (Fiddler का उपयोग करके) एक HTML सहायक जो ऐसा करेगा:

<div id="some-partial-view" ng:Controller="HomeController"> 
    <!-- ... --> 
</div> 
@Html.IncludeController("HomeController") 

हालांकि, मैं इसे सभी आंशिक विचारों में दोहराना नहीं चाहता हूं।

कोई विचार?

+0

अपने आंशिक दृश्य संदर्भ में अपने जावास्क्रिप्ट फ़ाइल,

+0

मैं, इस कदम को छोड़ करना चाहते हैं इसलिए प्रश्न । दृश्य प्रतिपादन के दौरान जेएस फ़ाइल बुनाई करना चाहते हैं। राउंडट्रिप्स को भी कम करना चाहते हैं, इसलिए यह एक विकल्प नहीं है। – leypascua

+0

यह स्पष्ट नहीं है कि "व्यू प्रतिपादन के दौरान जेएस फ़ाइल बुनाई" से आपका क्या मतलब है? –

उत्तर

15

आप एक कस्टम दृश्य लिख सकते हैं:

public class MyRazorView : RazorView 
{ 
    public MyRazorView(ControllerContext controllerContext, string viewPath, string layoutPath, bool runViewStartPages, IEnumerable<string> viewStartFileExtensions, IViewPageActivator viewPageActivator) 
     : base(controllerContext, viewPath, layoutPath, runViewStartPages, viewStartFileExtensions, viewPageActivator) 
    { 

    } 

    protected override void RenderView(ViewContext viewContext, TextWriter writer, object instance) 
    { 
     base.RenderView(viewContext, writer, instance); 

     var view = (BuildManagerCompiledView)viewContext.View; 
     var context = viewContext.HttpContext; 
     var path = context.Server.MapPath(view.ViewPath); 
     var viewName = Path.GetFileNameWithoutExtension(path); 
     var controller = viewContext.RouteData.GetRequiredString("controller"); 
     var js = context.Server.MapPath(
      string.Format(
       "~/ClientApp/Controllers/{0}/{0}.{1}.js", 
       viewName, 
       controller 
      ) 
     ); 
     if (File.Exists(js)) 
     { 
      writer.WriteLine(
       string.Format(
        "<script type=\"text/javascript\">{0}</script>", 
        File.ReadAllText(js) 
       ) 
      ); 
     } 
    } 
} 

और एक कस्टम दृश्य इंजन जो इस कस्टम दृश्य वापस आ जाएगी जब एक आंशिक दृश्य का अनुरोध किया जा सकता है:

public class MyRazorViewEngine : RazorViewEngine 
{ 
    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath) 
    { 
     return new MyRazorView(
      controllerContext, 
      partialPath, 
      null, 
      false, 
      base.FileExtensions, 
      base.ViewPageActivator 
     ); 
    } 
} 

जो Application_Start में पंजीकृत होना होगा:

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

    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 

    ViewEngines.Engines.Clear(); 
    ViewEngines.Engines.Add(new MyRazorViewEngine()); 
} 

आप शायद पथ के रूप में यह अपने प्रश्न में काफी स्पष्ट नहीं था, जहां वास्तव में js स्थित होना चाहिए के कुछ समायोजित करने की आवश्यकता है, लेकिन आप सामान्य रूप से जवाब में पर्याप्त विवरण होना चाहिए।

+0

वही जो मैं ढूंढ रहा था :) बस सोचा कि कस्टम व्यू इंजन लिखने का एक और तरीका है। बहुत बहुत धन्यवाद :) – leypascua

+0

@leypascua, अन्य तरीके हैं लेकिन यह एक सबसे कठिन है। –

+0

@DarinDimitrov क्या कोई तरीका है कि मैं लेखक से सभी HTML को किसी अन्य चीज़ से बदल सकता हूं? साथ ही, मैं इसे केवल तब निष्पादित कर सकता हूं जब यह नियंत्रक कार्रवाई द्वारा उपयोग किया गया दृश्य है, उदाहरण के लिए मेरे पास 'होम कंट्रोलर' और एक्शन 'होम' है और मैं चाहता हूं कि यह कोड केवल' होम 'पर निष्पादित किया जाए। आज यह पृष्ठ पर इस्तेमाल किए गए सभी विचारों से चल रहा है। – Terkhos

0

इसे और अधिक समझ बनाने हैं outter रिंग में तुम सब जावास्क्रिप्ट शामिल करने के लिए है, तो शामिल index.php के माध्यम से या जहाँ भी है कि ...

व्यक्तिगत तौर पर मैं jQuery का उपयोग करें और मैं की तरह तो ...

प्रत्येक वस्तु में शामिल
//View Objects 
(function($){ 

var views = { 

    init: function() 
    { 
     this.view1(); 
     this.view2(); 
    }, 
    view1 : function() 
    { 
    // I am 
    }, 
    view2 : function() 
    { 
    // all yours 
    } 

} 
//call/invoke my view objects 
$(function(){ 

    //call view object via init() 
    view.init(); 
}); 

})(jQuery); 
+0

कोई विकल्प नहीं है। लक्ष्य जेएस ऑन-डिमांड लोड करना है, केवल तभी जब इसकी ज़रूरत होती है। – leypascua

+0

अगर (getElementbyID (आईडी)) {// मुझे लोड करें यानी: elements.sexyID(); } – Philip

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