我有一个继承自基本控制器的控制器,我想知道如何利用基本控制器的所有逻辑,但返回与基本控制器使用的不同的视图.
基本控制器填充模型对象并将该模型对象传递给其视图,但我不确定如何在子控制器中访问该模型对象,以便我可以将其传递给子控制器的视图.
解决方法
几点.如果您知道所有要返回的内容,则可以将返回值键入ViewResult.然后,您可以从重写的实现中查询该值.更重要的是,根据MVC v1源代码,调用View(object)只需在控制器上设置ViewData.Model,然后构造一个ViewResult.
Controller.cs:440
protected internal ViewResult View(object model) { return View(null /* viewName */,null /* masterName */,model); }
Controller.cs:456
protected internal virtual ViewResult View(string viewName,string masterName,object model) { if (model != null) { ViewData.Model = model; } return new ViewResult { ViewName = viewName,MasterName = masterName,ViewData = ViewData,TempData = TempData }; }
所以你需要做的就是调用base方法并调用View(string).
namespace BaseControllers { public class CoolController { public virtual ViewResult Get() { var awesomeModel = new object(); return View(awesomeModel); } } } public class CoolController : BaseControllers.CoolController { public override ViewResult Get() { var ignoredResult = base.Get(); // ViewData.Model now refers to awesomeModel return View("NotGet"); } }
当然,您浪费cpu周期来构建您忽略的ViewResult.所以你可以这样做:
public class CoolController : BaseControllers.CoolController { public override ViewResult Get() { var baseResult = base.Get(); baseResult.ViewName = "NotGet"; return baseResult; } }
如果您的基本控制器返回ActionResult,则必须在更改ViewName之前将其强制转换为ViewResult.