我正在尝试为 MVC Controller 类编写一个扩展方法,因为我在我的程序中反复看到这样的代码:
if (viewModel == null)
{
return HttpNotFound();
}
return View(viewModel);
我的想法是我想要一个名为 ViewModelResult()
的扩展方法来处理这个问题,以便它返回 ActionResult
或 HttpNotFound
结果取决于 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/