2015-10-26 32 views
-1

我有一個控制器類繼承了一個處理/覆蓋虛擬方法(比如說JsonResult)的基類,並且在這個控制器中我需要阻止一個特定的JsonResult方法(並且只有這個方法一個)不被這個基類重寫。爲其餘的控制器方法創建一個action filter屬性是我想要做的最後一件事。你會如何做到這一點?防止特定的Action方法被基類覆蓋

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. 
    } 
} 
+0

請告訴我們一些代碼和解釋你是什麼意思'防止一個特定的方法被這個基類重寫' –

+0

「被基類覆蓋」?派生類可以重寫基類的方法,而不是其他方式...請澄清(並顯示一些代碼)。 –

+0

那麼,downvote真的有必要嗎?但無論如何,問題更新。 – jom

回答

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"); 
+0

好的,我可以使用這個Controller.Content方法。儘管如此仍然想要一個屬性:謝謝你的幫助! – jom

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. 
    } 
} 
+0

我沒有對基類文件的寫入權限,所以我想知道是否有任何一種屬性/操作過濾器可以讓你做到這一點? – jom

+0

好吧,我明白你的問題,請閱讀我剛剛添加的其他回覆 – user449689