2013-05-13 2 views
1

Я хочу создать довольно простой скрипт на сервере (клиентский прокси для событий на стороне сервера). Каков наиболее общий способ обработки скриптов на стороне сервера с помощью MVC4?Render javascript server side

Update после первого ответа: Я хочу, чтобы включать в себя, например @Scripts.Render("~/eventAggregation/events") и он должен вызывать код на моем сервере, который генерирует Javascript с C# код, также это для для Lib, так что я не могу сделать это с бритвой или MvcController, я хочу, чтобы он был близок к прокси-серверу SignalR, я посмотрел на этот код, но его несколько сотен строк кода для инъекции динамически сгенерированного скрипта должны быть проще, чем это?

+0

Я он никогда не использовал его, но из того, что я понимаю, для этого используется «Node.js». –

+0

Вы хотите, чтобы я менял backend на Node.js? – Anders

ответ

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

Nice! Я использовал IHttpHandlers еще в старых WebForms, но потом вам нужно было зарегистрировать их в Web.Config, это звучит точно так же, как и я.Будет проверять его сегодня вечером и принять ответ, если это то, что я хочу. Большое спасибо! – Anders

+0

Не могу дождаться, когда я вернусь домой: D – Anders

+0

Быстрое примечание, над кодом маршрута разрывается все ссылки на действия возвращают сценарий: D Вам нужно снабдить пустым контроллером новый RouteValueDictionary() {{"controller", string.Empty}}, – Anders

0

Есть расслоения и RenderSection и @ Scripts.Render (

пример:

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

Вы хотите передать код на стороне сервера на вниз просачиваться в ваш слой UI

пример :

атрибуты данных или идентификаторы элементов и их использование в JavaScript.

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

$ ('# MightyId'). Данные ('имя')

Или в тег сценария.

var ItemsList = "@item" 

ИЛИ:

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

См. Обновление – Anders