我對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值,對吧?
'bool'永遠不能爲空。只有'bool?'可以爲null。是聲稱.Claimed1.Value'bool'或'bool?'類型..?如果它是'bool',則不需要空檢查,因爲它不能爲空。如果它是'bool?'另一方面,使用這個檢查null:'bool isActivated = claims.Claimed1.Value.HasValue;' – danludwig
不知何故,我錯過了這個,但我也會使用它。 –