我正在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(对象模型)方法,但是它们不能被覆盖,我也找不到合适的方法来找到它们调用的动作。
答案 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()
语句时才有效。
通过一些调试和更多时间,我确信这可以修复:)
希望这有帮助!