防止特定的Action方法被基类覆盖

时间:2015-10-26 09:14:29

标签: c# asp.net-mvc model-view-controller

我有一个继承处理/覆盖虚方法(比如说JsonResult)的基类的控制器类,在这个控制器中我需要阻止特定的JsonResult方法(并且只有这个)被这个基类覆盖。为其余的控制器方法创建一个动作过滤器属性将是我想做的最后一件事。你会怎么做?

public class ControllerBase : Controller 
{
    protected override JsonResult Json(...) { 
        //do something here
    }
}

public class HomeController : ControllerBase 
{
    public JsonResult UpdateData(...) { 
        return base.Json(...); // I need to prevent this method from being overriden
    }

    public JsonResult UpdateResult(...) { 
        return this.Json(...); // this (and the other ones) can use the base method.
    }
}

2 个答案:

答案 0 :(得分:0)

您可以在基本控制器中定义一个标志,用于控制要调用的方法,如下所示:

public class ControllerBase : Controller 
{
    protected bool useOverriddenMethod = true;

    protected override JsonResult Json(...) {
        if (useOverriddenMethod )
        {
            //do something here
        }
        else
        {
            return base.Json(...);
        }
    }
}

然后在需要时相应地设置标志:

public class HomeController : ControllerBase 
{
    public JsonResult UpdateData(...) { 
        useOverriddenMethod = false;
        return this.Json(...); // I need to prevent this method from being overriden
    }

    public JsonResult UpdateResult(...) { 
        return this.Json(...); // this (and the other ones) can use the base method.
    }
}

答案 1 :(得分:0)

由于您无法编辑基本控制器,因此您可以使用Controller.Content方法传递以JSON格式格式化的对象。

要在JSON中转换对象,可以使用JavaScriptSerializer类,如下所示:

using System.Web.Script.Serialization;

JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
string jsonString = jsSerializer.Serialize(objectToSerialize);

然后您可以通过Content方法返回结果,如下所示:

return Content(jsonString, "application/json");