2013-05-13 154 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