Ja osobiście nie lubię grać z httpHandlers ze względów bezpieczeństwa. Chciałem zrobić dokładnie to samo, aby zapobiec dwukrotnemu zachowaniu tej samej struktury folderów (w widoku iw folderze skryptów). Tak więc celem jest przechowywanie .js w tym samym folderze co mój .cshtml i nie ma już błędu 404.
Rozwiązanie
Aby osiągnąć ten cel, używam niestandardowej HtmlHelper i sterownik dla JavaScript wywołuje.
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 Controller
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");
}
Gdy to zrobisz, po prostu trzeba dodać następujący kod w widoku/PartialView
@Html.JScriptBlock()
To działa, ale myślę, że jest to lepszy pomysł, aby nie umieścić pliki w folderze js widoków. – ErikE
Niewątpliwie bezpieczniejsze jest dodawanie do białej listy plików, na które wyraźnie chcesz zezwolić, zgodnie z odpowiedzią pod adresem http://stackoverflow.com/questions/604883/where-to-put-view-specific-javascript-files-in-an-asp -net-mvc-application zamiast samych tylko żądań filtrowania dla plików cshtml. – pwdst
U mnie zbudowałem układ MVC, który intensywnie wykorzystuje kątowe. Mam również AMD wszystko, co wymaga js, więc tylko widoki korzystające z niektórych fragmentów javascript powodują ładowanie tych skryptów java. W związku z tym podzieliłem wszystko na mniejsze części i było sensowne umieszczenie kontrolera kątowego skojarzonego z folderem mvc w folderze z widokiem. Mam coś takiego jak widoki \ ControllerName \ ControllerName.cshtml i views \ Controller \ ControllerName-controller.js. –