C# 扩展方法和保护级别?

标签 c# asp.net asp.net-mvc controller asp.net-mvc-5

我正在尝试为 MVC Controller 类编写一个扩展方法,因为我在我的程序中反复看到这样的代码:

if (viewModel == null)
{
    return HttpNotFound();
}
return View(viewModel);

我的想法是我想要一个名为 ViewModelResult() 的扩展方法来处理这个问题,以便它返回 ActionResultHttpNotFound 结果取决于 View 模型是否可用。这样我就不用每次都写这3-4行代码了。

但是,似乎 MVC Controller 中方法 View()HttpNotFound() 的保护级别导致了一些严重的问题。我已经编写了如下代码,但它不起作用:

public static class ExtensionController
{
    public static ActionResult ViewModelResult(this Controller controller, ViewModel viewModel)
    {
        if (viewModel == null)
        {
            return controller.HttpNotFound();
        }
        return controller.View(viewModel);
    }
}

它会抛出诸如“System.Web.MVC.Controller.View() 由于其保护级别而无法访问”之类的错误消息。这让我感到困惑,我认为在扩展方法中,由 this 关键字标记的对象的所有私有(private)和 protected 方法都是可访问的,就像您在此类中编写方法一样。但事实证明我错了,那些非公共(public)方法在扩展方法中是不可访问的。

现在的问题是,我该如何解决这个问题?我有点无能为力,不知道我能做些什么。 MVC Controller 类来自 .NET 框架,我无法修改源代码。不建议更改 .NET 框架的内部实现。谁能帮忙?在这种情况下,您建议我做什么?

最佳答案

您可以创建 Controller 类的子类并向其添加方法。

public abstract class ControllerBase : Controller
{
    protected ActionResult ViewModelResult(ViewModel viewModel)
    {
        if (viewModel == null)
        {
            return HttpNotFound();
        }
        return View(viewModel);
    }
}

public class ValuesController : ControllerBase
{
    public ActionResult Index()
    {
        var vm = ...;
        return ViewModelResult(vm);
    }
}

关于C# 扩展方法和保护级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29965527/

相关文章:

javascript - ASP.NET MVC RAZOR ActionLink 点击

c# - 第二个文本框显示与第一个相同的文本选择

jquery - 如何将 CSS 应用于在 jQuery 对话框中打开的 HTML 页面?

javascript - 如何使用 View 中的脚本方法从 Razor 列表框中获取变量

c# - 调用 ashx 处理程序后关闭浏览器中的选项卡

javascript - 单击时选择 AutoPostBack

c# - ASP.NET MVC5 不会创建 MySQL 数据库,除非在初始化程序处中断

asp.net-mvc - 创建一个 textarea 助手,将 View 的内容作为参数

c# - Task.Run 在 ASP .NET MVC Web 应用程序中被认为是不好的做法吗?

c# - 判断两个文件是否相同的最佳方法?