2013-05-13 219 views
1

我想在服務器上創建一個非常簡單的腳本(服務器端事件的客戶端代理)。 什麼是渲染腳本服務器端使用MVC4最常見的方式?第一個答案後渲染JavaScript服務器端

更新: 我想包括例如@Scripts.Render("~/eventAggregation/events"),它應該調用我的服務器上的代碼,用C#代碼生成JavaScript,也這是爲一個lib,所以我不能用剃刀做頁面或MvcController,我希望它接近SignalR的Hub代理,我看過那個代碼,但它的幾百行代碼注入動態生成的腳本,必須比這更容易?

+0

我我從來沒有使用它,但從我的理解,'Node.js'用於此。 – 2013-05-14 01:15:18

+0

您希望我將後端更改爲Node.js? – Anders 2013-05-15 08:09:45

回答

1

既然你說,你不能使用MvcController或Razor視圖,你可以得到更接近金屬:IHttpHandler

所以寫一個開始:

public class MyHandler : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     var response = context.Response; 
     response.ContentType = "text/javascript"; 
     var message = "This is some super dynamic message. The UTC time now is: " + DateTime.UtcNow.ToLongTimeString(); 
     var js = string.Format("alert({0});", new JavaScriptSerializer().Serialize(message)); 
     response.Write(js); 
    } 

    public bool IsReusable 
    { 
     get { return true; } 
    } 
} 

然後寫一個相應的路由處理:

public class MyHandlerProvider: IRouteHandler 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     return new MyHandler(); 
    } 
} 

,並在您Application_Start添加路由:

protected void Application_Start() 
{ 
    RouteTable.Routes.Add(
     new Route(
      "eventAggregation/events", 
      new MyHandlerProvider() 
     ) 
    ); 
} 

如果你沒不想手動在您的Application_Start中添加路線,您可以使用WebActivator。簡單地寫一個靜態的啓動類:

internal static class Startup 
{ 
    public static void Application_Start() 
    { 
     RouteTable.Routes.Add(
      new Route(
       "eventAggregation/events", 
       new MyHandlerProvider() 
      ) 
     );   
    } 
} 

,然後使用裝配寬屬性:

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(MvcApplication1.Startup), "Application_Start")] 

而現在,所有剩下的在你看來是引用它:

<script type="text/javascript" src="~/eventAggregation/events"></script> 
+0

好!我已經在舊的WebForms中使用過IHttpHandlers,但是那時你需要在Web.Config中註冊它們,這聽起來完全像我想要的。今晚將測試它,並接受答案,如果它是我想要的。非常感謝! – Anders 2013-05-14 09:12:22

+0

不能等到我回家:D – Anders 2013-05-14 11:13:00

+0

快速注意,上面的路由代碼中斷所有操作鏈接返回腳本:D您需要提供一個空的控制器new RouteValueDictionary(){{「controller」,string.Empty}}, – Anders 2013-05-27 14:46:35

0

有束和RenderSection和@ Scripts.Render(

例如:

"@RenderSection("Scripts", true)". 

你想傳遞下來的服務器端代碼滲入到你的UI層

例子:

data-attributes or id's to elements and grab them in JavaScript。

<div id="MightyId" data-name="@item.attribute"></div> 

$( '#MightyId')。數據( '名稱')

或者在腳本標籤。

var ItemsList = "@item" 

OR:

var Items List = @Html.Raw(Json.Encode(object)) 
+0

請參閱更新 – Anders 2013-05-14 07:46:38