2012-08-07 101 views
0

對於我的幾個控制器,我有一個實現常用操作的基類。MVC阻止基類控制器操作被路由到

例如
- BaseAccountController有一個登錄行動
- PublicAccountController從BaseAccountController繼承並實現進一步的行動
- CorporateAccountController從BaseAccountController繼承並實現進一步的行動

這給出了以下路線:
- BaseAccount /登錄
- PublicAccount /登錄
- CorporateAccount /登錄

r的標準方法是什麼請刪除路由BaseAccount/Login,因爲這不是必需的。我希望一個屬性控制器上:)

回答

5

您可以使用下面的自定義屬性爲您的基本控制器:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)] 
public class ClosedAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.Result = new HttpStatusCodeResult(404); 
    } 
} 

,您會收到404爲您的基本控制器的路線 - BaseAccount /登錄。但請確保Inherited屬性爲false(如示例中所示)。使用

例子:關於自定義操作

[Closed] 
public class BaseAccountController : Controller 
{ 
    ... 
} 

你可以閱讀更多的(如果需要)過濾器在這裏 - http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/understanding-action-filters-cs

+0

我正在嘗試這個過程,我會有迴應。 – 2012-08-07 09:21:47

+0

作品 - 謝謝 – 2012-08-08 07:05:58

+0

這個封閉的屬性只適用於類。我有類似的要求。除了我的基礎控制器還有許多其他的動作..我想直接停止訪問動作「A」,但繼承控制器可以通過他們的URL訪問它..我試過你的方法,但被告知AttributeUsage只用於類 – John 2015-04-22 08:43:47

0

如果BaseAccountController只有登錄操作,那麼你可以將其標記爲abstract

+0

Doesn'這意味着我必須在所有衍生控制器中實現它嗎? – 2012-08-07 06:10:15

+1

執行什麼?你的意思是登錄行動?不需要!你可以有一個虛擬的impl。 – VJAI 2012-08-07 06:50:04

+0

我不是很抱歉,來自MSDN「標記爲抽象或包含在抽象類中的成員必須通過派生自抽象類的類來實現。」這不是我想要做的。 – 2012-08-07 07:19:55