make controller actions'“return partialview()”自动链接到asp.net mvc3中的“_partialview.cshtml”

时间:2011-03-16 13:29:19

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

我正在MVC3中编写一个页面,有几个地方我想在ajax和url栏中请求页面。

如果请求是完整页面请求,我希望Action呈现“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(),它就不会更清晰; ?

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

编辑:

我仍然希望能够使偏见视图与视图不同,因此仅在少数情况下切换母版页就足够了。

我想做一些事情,比如重载默认路径以查找偏见,例如:

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

但这会影响PartialView(“Example”)使用_Example.cshtml,这是不可取的。

编辑:

我尝试的另一件事是重载控制器的PartialView()和PartialView(对象模型)方法,但是它们不能被覆盖,我也找不到合适的方法来找到它们调用的动作。

3 个答案:

答案 0 :(得分:4)

你见过this吗?它可能对您正在寻找的东西有所帮助。

答案 1 :(得分:0)

我在这个问题上写了一个非常实质性的答案: Simple ASP.NET MVC CRUD views opening/closing in JavaScript UI dialog

基本上,您调整视图引擎以打开常规请求的完整“主题”视图,然后返回视图,但是当请求通过ajax完成时,使用空主控。

答案 2 :(得分: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);
        }
    }

}

如果IsAjaxRequest返回true,这将追加MVC尝试解析的ViewName的“_”前面。

现在您需要做的就是使用以下属性修饰您的操作或控制器:

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

现在,我在运行中写了这个,所以在这个版本中它只有在你将ViewName实际传递到return View()语句时才有效。

通过一些调试和更多时间,我确信这可以修复:)

希望这有帮助!