2011-03-16 85 views
1

我正在写一个页面在MVC3,并有几个地方,我想要求一个页面ajax和网址栏。使控制器操作'“返回partialview()”自动链接到“_partialview.cshtml”在asp.net mvc3

如果请求是一个完整的页面请求,我希望操作呈现“Example.cshtml”这是一个完整的视图。 但请求是一个ajax请求我只想呈现“_Example.cshtml”这是一个局部视图。

我的代码是

if (Request.IsAjaxRequest()) 
    { 
     return PartialView("_Example"); 
    } 
    return View(); 

但是由于MVC3是所有关于公约和这一切都是可重新配置的,我希望能写

if (Request.IsAjaxRequest()) 
    { 
     return PartialView(); 
    } 
    return View(); 

,仍然加载“_Example.cshtml “如果这是一个局部的观点。 我的名字是“_Something.cshtml”,所有我的部分视图无论如何不会更干净,如果我只能调用PartialView(); ?

请告诉我,这是可能的。并告诉我如何。

编辑:

我还是希望能够使partialviews从不同的意见,所以切换母版就足够了只有少数病例。

我愿做类似超载的默认路径寻找partialviews,如:

PartialViewLocationFormats = new[] { 
    "~/Views/{1}/_{0}.ascx",    
}; 

但这种影响PartialView(“示例”)使用_Example.cshtml过,这是不可取的。

编辑:

我尝试过的另一件事是重载控制器的PartialView()和PartialView(对象模型)方法,但它们不能被重写无论是我能找到一个合适的方式找到其行动被他们称为从。

+0

你可以通过例子来解释你想要达到的效果,而且看起来你只能在局部视图中卡住。也许有更好的出路。 – CallMeLaNN 2011-03-16 17:31:43

回答

4

你见过this?它可能有助于你正在寻找的东西。

+0

这真棒,让我重新思考我的整个应用逻辑。 我会接受这一个作为答案。 – SoonDead 2011-03-18 21:54:31

0

我写了这一个相当可观的答案: Simple ASP.NET MVC CRUD views opening/closing in JavaScript UI dialog

基本上你调整视图引擎打开常规请求完整的“master主题”的观点,然后返回视图,但是空大师,当该请求通过ajax完成。

+0

感谢这个答案,虽然我喜欢你的解决方案,但我仍然想为视图和局部视图使用2个单独的cshtmls,而不仅仅是切换主页面。 我会更新我的主要问题以反映这一点。 – SoonDead 2011-03-16 13:48:46

0

您可以创建一个ActionFilterAttribute:

public class AjaxResultActionFilter: ActionFilterAttribute 
{ 

    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      var result = filterContext.Result as ViewResult; 
      result.ViewName = "_" + result.ViewName; 
      filterContext.Result = result; 
     } 
     else 
     { 
      base.OnResultExecuting(filterContext); 
     } 
    } 

} 

这将追加一个 “_” 的VIEWNAME的盈方是MVC尝试解析如果IsAjaxRequest返回true。

所有你现在需要做的是与此属性装饰或者您的行为或控制器:

[AjaxResultActionFilter] 
    public ActionResult Index() 
    { 
     return View("Index"); 
    } 

现在,我写了这对飞,所以在这个版本中,当你真正通过它只能将ViewName放入return View()声明中。

随着一些调试和更多的时间,我敢肯定,这可能是固定的:)

希望这有助于!

+0

感谢您的答案,但它仍然不是我想要实现的。如果我需要明确声明视图,我不妨用下划线来声明它。而且我需要为我的控制器写一个if(Request.IsAjaxRequest())以用于额外的服务器逻辑,因此将它放在属性中对我来说帮助不大。 – SoonDead 2011-03-16 15:02:33

+0

好吧,如果你已经需要在if(Request.IsAjaxRequest())中编写额外的逻辑 - 为什么你不能简单地在那里提供视图名?为什么所有额外的工作? – 2011-03-16 16:04:29

相关问题