加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 如何继承ASP.NET MVC控制器并仅更改视图?

发布时间:2020-12-15 20:49:56 所属栏目:asp.Net 来源:网络整理
导读:我有一个继承自基本控制器的控制器,我想知道如何利用基本控制器的所有逻辑,但返回与基本控制器使用的不同的视图. 基本控制器填充模型对象并将该模型对象传递给其视图,但我不确定如何在子控制器中访问该模型对象,以便我可以将其传递给子控制器的视图. 解决方
我有一个继承自基本控制器的控制器,我想知道如何利用基本控制器的所有逻辑,但返回与基本控制器使用的不同的视图.

基本控制器填充模型对象并将该模型对象传递给其视图,但我不确定如何在子控制器中访问该模型对象,以便我可以将其传递给子控制器的视图.

解决方法

几点.如果您知道所有要返回的内容,则可以将返回值键入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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读