asp.net-mvc - 如何继承 ASP.NET MVC Controller 并仅更改 View ?

标签 asp.net-mvc

我有一个从基本 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/

相关文章:

c# - 尝试迁移时无法映射模型属性中的属性列表

asp.net-mvc - ASP.NET MVC : how to add nested property to Modelstate?

asp.net - 表单例份验证 - 滑动过期

C# html 表单元素数组

javascript - 在应用程序之间移动时显示进度指示器

c# - 更改 URL 的单个路由部分

c# - 如何在客户端(使用 javascript)和服务器端(使用 c#)验证 mac 地址和 ip 地址

c# - Linq 在一个表中获取父项和子项并在另一个表中计算它们的值

jquery - 在编辑时设置 iggrid 组合值

asp.net-mvc - ASP.NET 身份密码验证