2011-12-27 14 views
11

我需要從約定驅動位置(如〜/ ClientApp/Controllers/Home/Home.js,如果加載位於〜/ Views/Home/Home.cshtml的視圖)寫入js文件的內容。我該怎麼做呢?如何攔截視圖渲染以在所有部分視圖上添加HTML/JS?

例如:如果文件〜/瀏覽/首頁/ 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> 

一種方法是增加一個HTML助手,將這樣做,如:

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

但是,我不想在所有部分視圖中重複這一點。

任何想法?

+0

在您的部分視圖中引用您的JavaScript文件 2011-12-27 07:34:00

+0

我想跳過這一步, 。想要在視圖渲染過程中編織js文件。也想減少往返,因此這不是一個選項。 – leypascua 2011-12-27 07:35:52

+0

目前還不清楚「視圖呈現期間編織js文件」是什麼意思? – 2011-12-27 07:38:24

回答

15

你可以寫一個自定義視圖

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 2011-12-27 08:28:24

+0

@leypascua,還有其他的方式,但這是DRYiest。 – 2011-12-27 08:36:58

+0

@DarinDimitrov有沒有一種方法可以用別的東西替代作家的所有HTML?另外,我如何才能在控制器操作使用視圖時執行此操作,例如我有一個'HomeController'和操作'Home',並且我希望只在視圖'Home'上執行此代碼。今天它運行在頁面上使用的所有視圖中。 – Terkhos 2017-05-09 20:45:20

0

它會更有意義,包括在outter圈你的JavaScript,然後包括通過的index.php或任何...

我個人使用jQuery和我包括每個對象是這樣的...

當局部視圖將被要求

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) 
       ) 
      ); 
     } 
    } 
} 

和一個自定義視圖引擎將返回該自定義視圖:

//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

沒有選項。目標是隻在真正需要的時候才按需加載JS。 – leypascua 2011-12-27 07:45:48

+0

if(getElementbyID(id)){// load me ie:elements.sexyID(); } – Philip 2011-12-27 07:55:57