У меня есть странная / раздражающая маленькая ошибка, которую я даже не знаю, как правильно объяснить, так что простите, если это станет немного словесным. Также объекты были переименованы для их защиты;)
Сайт 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 решает проблему.
Мой вопрос (наконец-то) заключается в следующем: как, не прибегая к изменению имени параметра метода действия, остановить это?