0

我對MVC3相對來說比較新,並且正在開發一個網站,該網站需要使用SQL Server,EF4等來處理默認Microsoft成員資格提供程序中的預加載帳戶。取得了一些進展,並且在某人的幫助下在所以,我已經得到ActionMethodSelectorAttribute正確工作,以幫助我。ActionMethodSelectorAttribute無法訪問類型?

也就是說,當我們看到某人的ID是他們嘗試加載個人資料頁面(www.mysite.com/profile/4)的一部分時,我們會查看該ID /帳戶是否被「聲稱」。 (我的原始發佈在這裏:MVC3 using routes or using controller logic?

不幸的是,在ActionMethodSelectorAttribute內部,我有一段時間做一個相對簡單的數據庫調用來確定帳戶是否聲明/未聲明。

這裏是我當前的代碼的狀態:

public class UserAccountActivatedAttribute : ActionMethodSelectorAttribute 
    { 
     public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo) 
     { 
      if (controllerContext == null) 
      { 
       throw new ArgumentNullException("controllerContext"); 
      } 
      // get profile id first 
      int id = int.Parse((string)controllerContext.RouteData.Values["id"]); 
      var profile = db.Profiles.Where(q => q.ProfileId == id).FirstOrDefault(); 
      bool isActivated = profile;// some code to get this state 
      return isActivated; 
     } 
    } 

線的分貝

var profile = db.Profiles.Where(q => q.ProfileId == id).FirstOrDefault(); 

錯誤。部分,並顯示錯誤消息如下:

無法通過嵌套類型「MySite.Controllers.HomeController.UserAccountActivatedAttribute」

訪問外類型「MySite.Controllers.HomeController」的非靜態成員。 ..與數據庫下的高亮錯誤。

有沒有人知道爲什麼,在ActionMethodSelectorAttribute中,我似乎無法進行此調用? (注:同一家庭控制器裏面,我在公衆面前做的ActionResult和的ViewResult類的許多類似的電話沒有任何錯誤)

編輯

我HomeController.cs看起來是這樣的:

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.Entity; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using MySite.Models; 

namespace MySite.Controllers 
{ 
public class HomeController : Controller 
{ 
    private MySiteEntities db = new MySiteEntities(); 

    public ActionResult Index() 
    { 
     ViewBag.Message = "Welcome to MySite.com!"; 
     return View(); 
    } 
    //several other ActionResults - create, delete, etc. 

    public class UserAccountActivatedAttribute : ActionMethodSelectorAttribute 
    { 
    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo) 
    { 
     if (controllerContext == null) 
     { 
      throw new ArgumentNullException("controllerContext"); 
     } 
     // get profile id first 
     int id = int.Parse((string)controllerContext.RouteData.Values["id"]); 
     var profile = db.Profiles.Where(q => q.ProfileId == id).FirstOrDefault(); 
     bool isActivated = profile;// some code to get this state 
     return isActivated; 
    } 
    } 

...肯定它落在家庭控制器。

編輯#2:

更緊密,但一個小問題與值始終爲TRUE。

public class UserAccountActivatedAttribute : ActionMethodSelectorAttribute 
{ 
    private MySiteEntities db = new MySiteEntities(); 

    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo) 
    { 
     if (controllerContext == null) 
     { 
      throw new ArgumentNullException("controllerContext"); 
     } 
     int id = int.Parse((string)controllerContext.RouteData.Values["id"]); 
     var data = new MySiteEntities(); 
     var claimed = db.Claimeds.FirstOrDefault(c => c.ProfileId == id); 
     bool isActivated = claimed.Claimed1.Value != null; 
     return isActivated; 
    } 
} 

claim.Claimed1.Value!= null;給我一個警告:由於類型'bool'的值永遠不等於'bool'類型的'null',因此表達式的結果總是'真'。

但是,我必須有東西來處理NULL值,對吧?

+0

'bool'永遠不能爲空。只有'bool?'可以爲null。是聲稱.Claimed1.Value'bool'或'bool?'類型..?如果它是'bool',則不需要空檢查,因爲它不能爲空。如果它是'bool?'另一方面,使用這個檢查null:'bool isActivated = claims.Claimed1.Value.HasValue;' – danludwig

+0

不知何故,我錯過了這個,但我也會使用它。 –

回答

1

我認爲你的代碼實際上看起來更像這樣,對嗎?

public class HomeController : Controller 
{ 
    public class UserAccountActivatedAttribute : ActionMethodSelectorAttribute 
    { 
     ... 
    } 
} 

您需要使屬性類成爲第一級類,而不是嵌套在控制器中。然後你需要給它自己的數據庫實例。

public class HomeController : Controller 
{ 
    ... 
} 

public class UserAccountActivatedAttribute : ActionMethodSelectorAttribute 
{ 
    private readonly CustomDbContext db = new CustomDbContext(); 

    public override bool IsValidForRequest(ControllerContext controllerContext, 
     MethodInfo methodInfo) 
    { 
     // original code here 
    } 
} 

這樣做的原因是因爲當屬性類嵌套在控制器類中,它不能訪問db實例變量,因爲它不是一個靜態變量。你的屬性應該不是嵌套類,並且應該有它們自己單獨的實例變量。 換句話說,不要試圖通過使控制器的db變量static來解決這個問題。

+0

啊哈!我不知道。我將編輯我的問題以顯示它的實際外觀,然後嘗試調查此問題。謝謝,丹! –

+0

我必須確保仍然在HomeController中但依賴於ActionMethodSelectorAttribute的一些ActionResults仍然可以工作。 [ActionName(「Profile」)] public ActionResult IndexNonActivated(int?id) { return RedirectToAction(「Claimed」,new {id = id}); } –

+0

ActionMethodSelectorAttribute不必與控制器位於同一個類或文件中。在action方法中使用'[UserAccountActivated]'語法將一個屬性應用於控制器。回去並重新閱讀這個:http://stackoverflow.com/a/10613782/304832 – danludwig