Как получить доступ к FormCollection, ViewData и ModelState - PullRequest
1 голос
/ 15 августа 2011

Есть ли способ получить доступ к FormCollection, ViewData, ModelState и т. Д. Текущего выполняющегося запроса при запуске в приложении ASP.NET MVC, кроме случаев, когда вы непосредственно работаете в View?Я хотел бы иметь возможность вызывать некоторые пользовательские обработчики из представления, но получить доступ к этим коллекциям, не пропуская их.Я думаю что-то похожее на HttpContext.Current в веб-формах?

Ответы [ 2 ]

2 голосов
/ 15 августа 2011

Попробуйте,

        var wrapper=new HttpContextWrapper(System.Web.HttpContext.Current);
        var routeData = RouteTable.Routes.GetRouteData(wrapper);
        Controller con = (Controller)ControllerBuilder.Current.GetControllerFactory().CreateController(new RequestContext(wrapper, routeData), routeData.Values["controller"].ToString());
        var viewData = con.ViewData;
        var modelState= con.ModelState;
        var form=new FormCollection();
        var controllerContext = new ControllerContext(wrapper, routeData, con);
        Predicate<string> propertyFilter = propertyName => new BindAttribute().IsPropertyAllowed(propertyName);
        IModelBinder binder = Binders.GetBinder(typeof(FormCollection));
        ModelBindingContext bindingContext = new ModelBindingContext()
        {
            ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => form, typeof(FormCollection)),
            ModelName = "form",
            ModelState = modelState,
            PropertyFilter = propertyFilter,
            ValueProvider = ValueProviderFactories.Factories.GetValueProvider(controllerContext)
        };
        form = (FormCollection)binder.BindModel(controllerContext, bindingContext);
0 голосов
/ 15 августа 2011

Существует объект ViewContext, который позволяет вам вернуться к большей части того, что вы просите, но вам действительно нужно спросить себя, почему вы делаете все это в представлении. (ИМХО в любом случае)

Редактировать: Возможно, я неправильно прочитал ваш вопрос. Существует ControllerContext в контроллере и ViewContext в представлении. Большинство точек расширяемости в MVC имеют своего рода объект Context, который позволяет получить запрос и его данные.

...