原控制器:
public class HomeController : Controller { public ActionResult Index() { // do something return View(); } }
使用扩展方法 扩展 Index():
public static class HomeControllerExtensions { public static ActionResult Index(this HomeController hc,string viewName) { // do something return View(viewName);//此处如何构建一个ViewResult ?,试了好几个方法都不行,脑子转不过来弯了,求指点一下! } }
首先自己写一个方法:
private ActionResult View(ModelBase model, string main, string box = "list")
{
model.views["box"] = box;
model.views["layout"] = "~/main/control/view/user/actor.aspx";
model.views["main"] = "~/main/control/view/user/" + main;
string viewFile = model.ajax ? model.views["main"] : model.views["layout"];
return base.View(viewFile, model);
}
使用上面的方法:
public ActionResult enterprise_selectPopup()
{
var model = new ActorModel();
return View(model, "enterprise_selectPopup.aspx");
}
上面的方法是我们项目中的使用的,这样可以实现你的多视图返回了,作为你的参考,希望对你有帮助。
谢谢,由于我这有点特殊,不能直接修改源代码,只能进行扩展(插件式的方式)!。
怎么调用Action method是由ActionInvoker决定的,默认的Action Invoker对方法有个要求:The method must not be static。所以你一定要这个功能的话,要写自己的Action Invoker替换掉默认的Action Invoker。
这个不行哦,无法访问哦!我最开始就是这么想的...
看来我思路错了!
为什么要这么扩展?怎么会有这种需求?一般对mvc的扩展都是用filter吧?
好吧,其实我就是想给 Index Action 加一个参数,可以根据视图名称显示不同视图,因为我有A、B两个视图,Model一样,就是View层排版不一样!我想用 Html.Action 调用时,指定视图名称。
前提不在 原HomeController 里修改?
给我介绍个方案?
不修改源码的话,弄一个全局拦截器。判断是/Home/Index的话,返回请求的viewName