是否可以通过Controller方法以编程方式调用Razor编译器?

时间:2011-12-20 14:30:12

标签: c# asp.net asp.net-mvc asp.net-mvc-3 razor

我正在使用ASP .NET MVC 3,我有一个有趣的问题要解决,我希望得到一些建议。

我有一个页面里面有很多div。每个div的内容随着时间的推移而变化,所以目前我为每个div运行一个计时器,它向服务器发出一个$ .ajax请求,返回一个带有div更新内容的PartialViewResult。部分视图非常复杂,并引用其他视图。

这种方法的问题在于它不能很好地扩展。可能是每个用户都有很多这样的计时器在运行,而且很多用户服务器都在不断受到攻击。因此,我宁愿向服务器发出一个请求,该请求可能返回多个div内容,因此它将是:

div1 { some html }
div2 { some html }

...

然后在客户端上我可以将每一位HTML放到页面上的正确位置。

我认为我能做的就是从服务器返回JSON但我的问题是 - 如何获取HTML?目前剃刀编译器将运行并将我的部分视图cshtml文件转换为HTML但是如果我返回JSON,是否可以通过编程方式调用razor编译器?

我在这里找到了Razor Engine:http://razorengine.codeplex.com/似乎做了我想要的但是可以用vanilla ASP NET MVC做到这一点吗?

或者,考虑到问题,有没有更好的方法可以实现我的目标?

感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

创建一个Action,返回一个渲染所有这些PartialViews的新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);

答案 1 :(得分:3)

你可以有两个方法 - 一个返回HTML而另一个返回JSON。

或者创建一个ActionResult,委托给JsonResult if the request is an Ajax request或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);
    }
  }
}

答案 2 :(得分:1)

为什么你只是让你调用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