我有一个从基本 Controller 继承的 Controller ,我想知道如何利用基本 Controller 的所有逻辑,但返回与基本 Controller 使用的不同的 View 。
基本 Controller 填充模型对象并将该模型对象传递到其 View ,但我不确定如何在子 Controller 中访问该模型对象,以便将其传递到子 Controller 的 View 。
最佳答案
几点。如果您知道这就是要返回的全部内容,则可以将返回值键入为 ViewResult。然后您可以从重写的实现中询问该值。更重要的是,根据 MVC v1 源代码,调用 View(object) 只需在 Controller 上设置 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
};
}
所以您需要做的就是调用基本方法并调用 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;
}
}
如果您的基本 Controller 返回 ActionResult,则必须在更改 ViewName 之前将其强制转换为 ViewResult。
关于asp.net-mvc - 如何继承 ASP.NET MVC Controller 并仅更改 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1567084/