2012-03-08 11 views
10

मैं अपने विचारों के साथ अपनी जावास्क्रिप्ट फ़ाइलों को रखने की कोशिश कर रहा हूं।विचार फ़ोल्डर में जेएस फाइलें रखने

मेरे पास निम्न जेएस फ़ाइल स्थान है। /Views/Home/Home.js

हालांकि, जब किसी स्क्रिप्ट टैग के संदर्भ में, तो इसका परिणाम 404 त्रुटि होता है।

अतः निम्नलिखित प्रश्न के अनुसार: ASP.NET MVC - Where do you put your .js files if you dont want to store them in /Scripts?

मैं अपने रजिस्टर मार्गों के लिए file.js गयी। (समस्या का समाधान नहीं किया)

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{file}.js"); 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    } 

मैं अपने विचारों के बगल में अपनी जेएस फाइलों को कैसे संग्रहीत और संदर्भित कर सकता हूं?

उत्तर

24

समस्या यह है कि, सुरक्षा कारणों से वेब फ़ोल्डर कॉन्फ़िगरेशन फ़ोल्डर के अंदर है जो सभी फ़ोल्डर को उस फ़ोल्डर में फ़ाइलों से अनुरोध करता है। IIS7

<httpHandlers> 
    <add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/> 
</httpHandlers> 

और के लिए:: आप इसका कॉन्फ़िग फ़ाइल में मिल जाएगा

<handlers> 
    <remove name="BlockViewHandler"/> 
    <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" /> 
</handlers> 

समाधान

आप वाइल्डकार्ड बदल सकते हैं केवल टी पकड़ने के लिए वह .cshtml फाइलें।

<httpHandlers> 
    <add path="*.cshtml" verb="*" type="System.Web.HttpNotFoundHandler"/> 
</httpHandlers> 

<handlers> 
    <remove name="BlockViewHandler"/> 
    <add name="BlockViewHandler" path="*.cshtml" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" /> 
</handlers> 

इस वाइल्डकार्ड के साथ

, .js फ़ाइलों अवरुद्ध नहीं किया जाएगा।

+1

यह काम करता है, लेकिन मुझे लगता है यह एक बेहतर विचार दृश्य फ़ोल्डर में js फ़ाइलें नहीं डाल करने के लिए है। – ErikE

+2

http://stackoverflow.com/questions/604883/where-to-put-view-specific-javascript-files-in-an-asp पर उत्तर के अनुसार स्पष्ट रूप से अनुमति देने वाली फ़ाइलों को श्वेतसूची में निस्संदेह सुरक्षित रखना सुरक्षित है। cnettml फ़ाइलों के लिए फ़िल्टर अनुरोधों के बजाय -नेट-एमवीसी-एप्लिकेशन स्वयं। – pwdst

+1

मेरे लिए, मैंने एक एमवीसी सेटअप बनाया है जो कोणीय का भारी उपयोग करता है। मैंने जम्मू की आवश्यकता के साथ सब कुछ भी किया है, इसलिए कुछ जावास्क्रिप्ट टुकड़ों का उपयोग करने के लिए केवल उन दृश्यों को लोड करने के लिए उन जावा स्क्रिप्ट फ़ाइलों का उपयोग होता है। इस तरह मैंने सब कुछ विभाजित किया और दृश्य के साथ फ़ोल्डर में एक एमवीसी फ़ोल्डर से जुड़े कोणीय नियंत्रक को रखने के लिए बहुत समझदारी की। तो मेरे पास कुछ विचार \ ControllerName \ ControllerName.cshtml और विचार \ नियंत्रक \ नियंत्रकनाम-नियंत्रक.जेएस जैसे कुछ हैं। –

2

मैं व्यक्तिगत कारणों से सुरक्षा कारणों से httpHandlers के साथ खेलना पसंद नहीं करता हूं। मैं वही फ़ोल्डर संरचना को दो बार बनाए रखने से रोकने के लिए एक ही चीज़ करना चाहता था (दृश्य में और स्क्रिप्ट फ़ोल्डर में)। तो, लक्ष्य .js को उसी फ़ोल्डर में संग्रहीत करना है जो मेरे .cshtml के रूप में है और अब 404 त्रुटि नहीं है।

समाधान

उस लक्ष्य तक पहुंचने के लिए, मैं एक कस्टम HtmlHelper और जावास्क्रिप्ट के लिए कहता है एक नियंत्रक का उपयोग करें।

HtmlHelper

public static MvcHtmlString JScriptBlock<TModel>(
     this HtmlHelper<TModel> html 
    ) 
    { 
     // Get the physical path of the .js file we are looking for. 
     string path = ((System.Web.Mvc.RazorView)html.ViewContext.View).ViewPath.Replace(".cshtml", ".js"); 
     path = HostingEnvironment.MapPath(path); 

     if (!File.Exists(path)) 
      return null; 

     // We store the physical path in a session variable with GUID as the key 
     string guid = Guid.NewGuid().ToString(); 
     HttpContext.Current.Session[guid] = path; 

     // Create the script block where the src points to the JScript controller. We give the GUID as parameter. 
     return MvcHtmlString.Create("<script src='/JScript/?id=" + guid + "'/>"); 

    } 

JScript नियंत्रक

public ActionResult Index(string id) 
    { 
     // id correspond to the guid generated by the MSRJScript helper 

     // We look if the physical path of the .js is available in the session variables 
     if(Session[id] == null) 
      return new HttpStatusCodeResult(HttpStatusCode.Forbidden); 

     // If the physical path was found, we simply send the file back to the browser. 
     string path = Session[id].ToString(); 
     Session.Remove(id); 

     return File(path, "application/javascript"); 
    } 

ऐसा करने के बाद, आप बस अपने दृश्य में निम्न कोड जोड़ने के लिए/PartialView

@Html.JScriptBlock() 
+0

मुझे वास्तव में यह पसंद है, लेकिन क्या यह स्थिर फाइलें प्राप्त करने के लिए धीमी नहीं है क्योंकि यह वास्तविक फ़ाइल तक पहुंचने तक बहुत सारे एमवीसी आवेदकों और तरीकों से गुज़रती है? –

1

में मेरी राय, यह एक अच्छा तरीका है: यह कोड को सरल रखता है और अन्य संसाधन प्रकारों के साथ सुरक्षा समस्या को छूता नहीं है।

बस अनुभाग संचालकों में निम्नलिखित जोड़ें:

<add name="JavaScriptHandler" path="*.js" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" /> 
संबंधित मुद्दे