我正在使用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做到这一点吗?
或者,考虑到问题,有没有更好的方法可以实现我的目标?
感谢您的帮助!
答案 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
在视图的特定部分进行渲染,它只不过是一个名为