Можно ли вызвать Razor Compiler программно из метода контроллера? - PullRequest
8 голосов
/ 20 декабря 2011

Я использую ASP .NET MVC 3, и у меня есть интересная проблема, для решения которой я надеюсь дать несколько советов.

У меня есть страница с несколькими элементами div.Содержимое каждого div изменяется со временем, и поэтому в настоящее время у меня есть таймер для каждого запуска div, который отправляет серверу запрос $ .ajax, который возвращает PartialViewResult с обновленным содержимым div.Частичное представление является довольно сложным и ссылается на другие представления.

Проблема этого подхода заключается в том, что он не очень хорошо масштабируется.Может случиться так, что у каждого пользователя работает много таких таймеров, и при большом количестве пользователей сервер постоянно поражается.Поэтому я бы предпочел сделать один запрос к серверу, который, возможно, возвращает несколько Div-содержимого, так что это будет:

div1 { some html }
div2 { some html }

...

Тогда на клиенте я смогупоместите каждый бит HTML в правильную позицию на странице.

Я думал, что я мог бы вернуть JSON с сервера, но моя проблема - как мне получить HTML?В данный момент компилятор бритвы запустится и превратит мои cshtml файлы частичного просмотра в HTML, но если я возвращаю JSON, возможно ли программно вызвать компилятор бритвы?

Я нашел Razor Engine здесь: http://razorengine.codeplex.com/ это, кажется, делает то, что я хочу, но возможно ли это сделать только с помощью ванильного ASP NET MVC?

Или, учитывая проблему, есть ли лучший способ, которым я мог бы достичь своей цели?

Спасибо за любую помощь!

Ответы [ 3 ]

5 голосов
/ 20 декабря 2011

Создайте действие, которое возвращает новый PartialView, который отображает все эти PartialView.например, действие:

public PartialViewResult AggregatedAction(args)
{
    return PartialView();
}

с представлением, которое содержит:

@Html.Action("IndividualAction1", null)
@Html.Action("IndividualAction2", null)
@Html.Action("IndividualAction3", null)

Подробнее см. http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx.

Таким образом, есть только один запрос , и механизм рендеринга вызывается из правильного места, то есть из представления.

Затем с помощью результата вы можете искать различные div и заменять html в клиенте.

$('div#id1').html('div#id1',$(data));
$('div#id2').html('div#id2',$(data));

Если структура вашей страницы это позволяет, вы должны использовать: http://api.jquery.com/load/ (как говорит @Jorge), чтобы заменить все HTML одной строкой.

$('div#targetDiv').load('Controller\AggregatedAction', anyData);
3 голосов
/ 20 декабря 2011

У вас может быть два метода: один возвращает HTML, а другой - JSON.

Или, альтернативно, создайте ActionResult, который делегирует JsonResult , если запрос является Ajax-запросом , или PartialViewResult в противном случае, например:

public class AjaxableResult : ActionResult
{

  private readonly JsonResult _jsonResult;
  private readonly PartialViewResult _partialViewResult;

  public AjaxableResult(JsonResult jsonResult, PartialViewResult partialViewResult)
  {
    _jsonResult = jsonResult;
    _partialViewResult = _partialViewResult;
  }      

  public override void ExecuteResult(ControllerContext context)
  {
    if (context.HttpContext.Request.IsAjaxRequest()) {
      _jsonResult.ExecuteResult(context);
    }
    else
    {
      _partialViewResult.ExecuteResult(context);
    }
  }
}
1 голос
/ 20 декабря 2011

Почему вы просто вызываете ajax и вместо того, чтобы ожидать, что объект JSON отправит клиенту HTML-код с методом в вашем контроллере ActionResult, помните, что этот тип возвращает HTML-код типа представления, подобного этому

 //this if you want get the html by get
 public ActionResult Foo()
 {
    return View();
 }

И клиент так назвал

$.get('your controller path', parameters to the controler , function callback)

или

$.ajax({
        type: "GET",
        url: "your controller path",
        data: parameters to the controler
        dataType: "html",
        success: your function
    });

Также вы можете загружать частичные представления и визуализировать в определенных частях вашего представления с помощью jquery load, который является не более чем ajax с именем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...