Чтение не примитивных ActionParameters из filterContext в ActionFilter - PullRequest
1 голос
/ 09 марта 2012

В настоящее время я занимаюсь разработкой проекта ASP.NET MVC.

Я хочу реализовать ActionFilter, который заботится о правах собственности. Пользователь может получить доступ только к тем объектам, с которыми он связан в базе данных.

Теперь я не хочу внедрять это в каждый контроллер. Вместо этого я хочу использовать ActionFilter. Я уже могу определить входящие параметры и прочитать их значения с помощью следующего кода:

Контроллер

[Validate(ParameterName = "userID", EntityType="User")]
public ActionMethod Edit(int userID){...

ActionFilter

public string ParameterName { get; set; }
public string EntityType { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
    if (EntityType != null && ParameterName != null)
    {
        Debug.Print("Checking if user has access to the Type \"" + EntityType + "\" with the
ID " + filterContext.ActionParameters[ParameterName]);
...

Пока это работает отлично. Но когда дело доходит до непримитивных типов (например, User), я нахожу только значение NULL в filterContext.ActionParameters [ParameterName]);

См

[HttpPost]
[Validate(ParameterName = "user", EntityType = "User")]
public ActionResult Edit(User user)
{....

Я не могу понять, почему. Может быть потому, что это метод HttpPost?

1 Ответ

2 голосов
/ 10 марта 2012

Это должно работать, если вы унаследовали от ActionFilterAttribute и не внедрили IAuthorizationFilter, потому что если вы реализуете этот интерфейс, фильтр действий будет работать до связывателя модели, и вы не сможете получить результат этой моделисвязыватель, только простые значения HTTP-запроса.Вот пример:

public class User
{
    public string FirstName { get; set; }
}

Атрибут проверки:

public class ValidateAttribute : ActionFilterAttribute
{
    public string ParameterName { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var result = (User)filterContext.ActionParameters[ParameterName];
        if (result.FirstName == "john")
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }
    }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new User
        {
            FirstName = "john"
        });
    }

    [HttpPost]
    [Validate(ParameterName = "user")]
    public ActionResult Index(User user)
    {
        return View(user);
    }
}

Вид:

@model User

@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.FirstName)
    <button type="submit">OK</button>
}
...