Lor*_*ill 1 c# asp.net asp.net-mvc controller asp.net-mvc-5
我正在尝试为MVC控制器类编写扩展方法,因为我在程序中反复看到这样的代码:
if (viewModel == null)
{
return HttpNotFound();
}
return View(viewModel);
Run Code Online (Sandbox Code Playgroud)
我的想法是,我想要一个调用的扩展方法ViewModelResult()来处理这个问题,因此它将返回一个ActionResult或一个HttpNotFound结果,具体取决于视图模型是否可用.这样,我不必每次都写这3-4行代码.
但是,似乎方法View()和HttpNotFound()MVC控制器的保护级别造成了一些严重的麻烦.我已经编写了如下代码,但它不起作用:
public static class ExtensionController
{
public static ActionResult ViewModelResult(this Controller controller, ViewModel viewModel)
{
if (viewModel == null)
{
return controller.HttpNotFound();
}
return controller.View(viewModel);
}
}
Run Code Online (Sandbox Code Playgroud)
它抛出错误消息,例如"System.Web.MVC.Controller.View()由于其保护级别而无法访问".这让我感到困惑,我认为在扩展方法中,this关键字标记的对象的所有私有和受保护方法都是可访问的,就像在此类中编写方法一样.但我被证明是错误的,那些非公开的方法在扩展方法中是不可访问的.
现在问题是,我怎样才能解决这个问题?我有点无能,不知道我能做些什么.MVC控制器类在.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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
942 次 |
| 最近记录: |