Привязка нежелательной модели в пользовательском фильтре - PullRequest
0 голосов
/ 17 января 2011

У меня есть странная / раздражающая маленькая ошибка, которую я даже не знаю, как правильно объяснить, так что простите, если это станет немного словесным. Также объекты были переименованы для их защиты;)

Сайт MVC, над которым я работаю (я не запускал его, я просто работаю над ним), имеет собственный атрибут фильтра, который вставляет параметр в любой метод действия, который украшен указанным фильтром. Параметр содержит сведения о зарегистрированном пользователе, которые используются для определения прав на основе ролей. Смотрите пример ниже:

[UserFilter]
public ActionResult DoSomeStuffDependingOnPrivileges(string userId, UserObj user)

UserObj - это модель. Это выглядит примерно так:

public class User  
{  
    [DisplayName("User ID")]  
    public int UserID { get; set; }

    ...
    ...
    ...

    public IEnumerable<RoleModels.Role> Roles { get; set; }
}

Вот фильтр пользовательских действий:

public override void OnActionExecuting(ActionExecutingContext filterContext)  
{  
    if (filterContext.ActionParameters.ContainsKey(key))  
    {  
        if (filterContext.HttpContext.User.Identity.IsAuthenticated)  
        {  
            var user = (User)filterContext.HttpContext.Session["User"];
            filterContext.ActionParameters[key] = user;
        }  
    }  

    base.OnActionExecuting(filterContext);
}

Таким образом, он работает так, что фильтр заполняет параметр UserObj из сохраненного значения сеанса. Он не передается кодом, вызывающим метод действия. Я предполагаю, что идея состояла в том, чтобы очистить или централизовать код или какое-либо такое благородное намерение.

Странная вещь заключается в следующем: посмотрите на метод действия. Я передаю строковый параметр с именем userId. Этот userId - это идентификатор пользователя, отличного от того, который указан в параметре UserObj (воспринимайте его как отношение сотрудника менеджера). Когда фильтр действия выполняется, он заполняет пользовательский параметр по желанию, но по какой-то причине он заполняет свойство UserID указанного пользовательского параметра (int) параметром userId (string), переданным в метод действия, таким образом, что делает ModelState недействительным, даже если не хотел проверять модель UserObj.

Почему Ларри, почему!

Обойти это достаточно просто. переименование параметра userId решает проблему.

Мой вопрос (наконец-то) заключается в следующем: как, не прибегая к изменению имени параметра метода действия, остановить это?

Ответы [ 2 ]

1 голос
/ 17 января 2011

Вы пытались использовать BindAttribute ?

0 голосов
/ 17 января 2011

Спасибо, Якуб.

Добавление атрибута Bind сделало свое дело.

Я изменил параметр метода UserObj метода действия на

public ActionResult DoSomeStuffDependingOnPrivileges(string userId, [Bind(Exclude = "userId")] UserObj user)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...