MVC 3:如何在通过ajax加载时呈现视图而不包含其布局页面?
MVC 3:如何在通过ajax加载时呈现视图而不包含其布局页面?
我正在学习渐进增强,我对AJAX化视图有一个问题。在我的MVC 3项目中,我有一个布局页面、一个viewstart页面和两个普通视图。\nviewstart页面位于Views文件夹的根目录下,因此适用于所有视图。它指定所有视图应该使用_Layout.cshtml
作为它们的布局页面。布局页面包含两个导航链接,每个视图一个。这些链接使用@Html.ActionLink()
来呈现在页面上。\n现在我已经添加了jQuery,想要劫持这些链接并使用Ajax动态加载它们的内容到页面上。\n
\n我能想到两种方法来实现这个,但我不太喜欢其中的任何一种:\n1)我可以将整个视图的内容放在一个局部视图中,然后在呈现主视图时调用局部视图。这样,使用控制器中的Request.IsAjaxRequest()
,我可以根据请求是否为Ajax请求返回View()
或PartialView()
。我不能将常规视图返回给Ajax请求,因为那样它会使用布局页面,并且我会得到一个注入了第二个布局页面的副本。但是,我不喜欢这个方法,因为它迫使我为标准的GET请求创建一个只有@{Html.RenderPartial();}
的空视图。\n
public ActionResult Index() { if (Request.IsAjaxRequest()) return PartialView("partialView"); else return View(); }
\n然后在Index.cshtml中添加以下代码:\n@{Html.RenderPartial(\"partialView\");}\n
\n2)我可以从_viewstart中删除布局指定,并在非Ajax请求时手动指定它:\n
public ActionResult Index() { if (Request.IsAjaxRequest()) return View(); // 返回没有主布局的视图。 else return View("Index", "_Layout"); // 返回带有主布局的视图。 }
\n有人有更好的建议吗?是否有一种方法可以返回一个没有布局页面的视图?如果是Ajax请求,明确地说“不要包含布局”将会更容易,而明确地包含布局如果不是Ajax请求将会更困难。
问题的原因是对于使用Ajax加载的视图,希望在不加载布局页面的情况下渲染视图。解决方法是使用PartialView()
方法来返回HTML的任意部分,而不是使用View()
方法返回整个页面。这样可以避免在Ajax加载时加载整个布局页面,只返回需要的HTML部分。此外,可以根据Request.IsAjaxRequest()
方法判断是否为Ajax请求,从而决定使用View()
还是PartialView()
。如果需要根据Ajax请求的不同返回不同的内容,可以考虑创建一个单独的Ajax操作来处理。总之,使用PartialView()
和Request.IsAjaxRequest()
可以实现在Ajax加载时只返回需要的HTML部分而不加载整个布局页面。
MVC 3: 如何在通过ajax加载时渲染视图而不加载布局页面?
问题的出现原因:
在ViewStart.cshtml文件中,使用了一个条件语句来确定是否需要加载布局页面。如果请求是通过ajax加载的,则布局页面设置为null,否则加载共享的_Layout.cshtml布局页面。然而,有人认为在ViewStart页面中加入逻辑判断不太好,因为ViewStart页面应该只负责设置默认的布局页面,而不应该包含逻辑。
解决方法:
有一种解决方法是在控制器中设置布局页面。通过在控制器的返回视图方法中使用适当的重载方法来指定布局页面。这样可以避免在ViewStart页面中加入逻辑判断。
另外,还有一种解决方法是在基础控制器中设置一个属性,在ViewData中存储布局页面的信息,并在视图中使用该属性来设置布局页面。这样可以避免在每个控制器中都设置布局页面。
然而,有人认为这种方法破坏了关注点分离原则,因为视图不应该关心如何渲染,而控制器有所有必要的信息来决定渲染结果的内容和方式。