Вы можете делать то, что вам нужно, используя фильтр пользовательских действий.Переопределив OnActionExecuting
, мы получаем доступ к данным маршрута и параметрам действия действия, которое будет выполнено.Дано:
public class BindUserProfileAttribute : ActionFilterAttribute
{
public override OnActionExecuting(FilterContext filterContext)
{
string id = (string)filterContext.RouteData.Values["UserId"];
var model = new UserProfile { Id = id };
filtextContext.ActionParameters["userObj"] = model;
}
}
Этот атрибут позволяет нам создавать параметры, которые будут переданы в действие, поэтому мы можем загрузить пользовательский объект на этом этапе.
[BindUserProfile]
public ActionResult EditProfile(UserProfile userObj)
{
}
Вы будетевероятно, вам нужно конкретизировать ваши маршруты:
routes.MapRoute(
"EditProfile",
"Account/EditProfile/{UserId}",
new { controller = "Account", action = "EditProfile" });
В MVC3 мы получаем доступ к новому интерфейсу IDepedencyResolver, который позволяет нам выполнять IoC / SL с использованием любого контейнера IoC или локатора служб, который мы хотим, поэтомувставьте сервис, подобный IUserProfileFactory
, в свой фильтр, чтобы затем создать свой экземпляр UserProfile
.
Надеюсь, это поможет?