2011-11-15 53 views
13

朋友,在asp.net中生成JavaScript文件mvc

我想在我的應用程序中使用DyGraph。請看下面的代碼 -

<head> 
    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7; IE=EmulateIE9"> 
    <title>crosshairs</title> 

    <script type="text/javascript" src="dygraph-combined.js"></script> 

    <script type="text/javascript" src="data.js"></script> 
    </head> 

代碼使用含功能得到一些靜態數據data.js文件。 我想要使用控制器方法生成data.js,以便它將使用數據庫生成數據。

任何人都可以幫我解決這個問題。

感謝您分享寶貴的時間。

+0

這裏是類似的問題與更優雅的解決方案:http://stackoverflow.com/questions/16092473/dynamically-generated-javascript-css-in-asp-net-mvc –

回答

32

你可以定義一個控制器動作:

public ActionResult Data() 
{ 
    // Obviously this will be dynamically generated 
    var data = "alert('Hello World');"; 
    return JavaScript(data); 
} 

然後:

<script type="text/javascript" src="<%= Url.Action("Data", "SomeController") %>"></script> 

如果你有一些複雜的腳本,你不想在控制器,你可以按照標準的產生通過定義視圖模型的MVC模式:

public class MyViewModel 
{ 
    ... put required properties 
} 

控制器操作將會彈出吃這種觀點模型,並將其傳遞給視圖:

public ActionResult Data() 
{ 
    MyViewModel model = ... 
    Response.ContentType = "application/javascript"; 
    return PartialView(model); 
} 

和最後一個視圖,其在這種情況下將是視圖模型的JavaScript的表示(~/Views/SomeController/Data.ascx):

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<MyViewModel>" %> 
alert(<%= new JavaScriptSerializer().Serialize(Model.Name) %>); 
+0

感謝達林爲您的快速回復和詳細說明。 +1。 – IrfanRaza

+0

以這種方式生成的JavaScript文件不會被壓縮。我敢打賭,它有一些要求不會以.js和iis結尾的請求。 –

0

完全披露

  • 這個答案是複製/從另一個問題粘貼:
  • 這個答案是類似於這裏其他的答案。
    • 此答案使用cshtml頁面而不是ascx控件。
    • 此答案提供僅查看解決方案而非僅限控制器解決方案。
    • 我不認爲我的答案是'更好',但我認爲它可能會更容易一些。

動態CSS在CSHTML文件

我用CSS評論/* */註釋掉新<style>標籤,然後我return;閉幕風格標記之前:

/*<style type="text/css">/* */ 

    CSS GOES HERE 

@{return;}</style> 

CSHTML文件中的動態JS

我使用JavaScript評論//註釋掉新<script>標籤,然後我return;關閉腳本標記之前:

//<script type="text/javascript"> 

    JAVASCRIPT GOES HERE 

@{return;}</script> 

MyDynamicCss.cshtml

@{ 
var fieldList = new List<string>(); 
fieldList.Add("field1"); 
fieldList.Add("field2"); 

} 

/*<style type="text/css">/* */ 

@foreach (var field in fieldList) {<text> 

input[name="@field"] 
, select[name="@field"] 
{ 
    background-color: #bbb; 
    color: #6f6f6f; 
} 

</text>} 

@{return;}</style> 

MyDynamicJavsScript.cshtml

​​

無控制器所需使用下面的代碼(使用查看/共享)

。我把我的動態腳本到Views/Shared/,我可以很容易地將它們嵌入到任何現有的頁面(或_Layout.cshtml):

<style type="text/css">@Html.Partial("MyDynamicCss")</style> 
<script type="text/javascript">@Html.Partial("MyDynamicJavaScript")</script> 

使用控制器(可選)

如果你願意,你可以創建一個控制器如

<link rel="stylesheet" type="text/css" href="@Url.Action("MyDynamicCss", "MyDynamicCode")"> 
<script type="text/javascript" src="@Url.Action("MyDynamicJavaScript", "MyDynamicCode")"></script> 

這裏的控制器可能是什麼樣子

MyDynamicCodeController.cs(可選)

[HttpGet] 
public ActionResult MyDynamicCss() 
{ 
    Response.ContentType = "text/css"; 
    return View(); 
} 

[HttpGet] 
public ActionResult MyDynamicJavaScript() 
{ 
    Response.ContentType = "application/javascript"; 
    return View(); 
} 

注意

  • 控制器版本未經測試。我只是把它從頭頂上打下來。
  • 重新閱讀我的答案後,它對我來說可能就像註釋掉結束標記一樣容易,而不是使用cshtml @{return;},但我沒有嘗試過。我想這是一個偏好問題。
  • 關於我的整個答案,如果您發現任何語法錯誤或改進,請讓我知道。