如何访问FormCollection,ViewData和ModelState

时间:2011-08-14 21:10:05

标签: asp.net-mvc viewdata modelstate formcollection

有没有办法在ASP.NET MVC应用程序中运行时访问当前运行的请求的FormCollection,ViewData,ModelState等,而不是直接在View中工作?我希望能够从视图中调用一些自定义处理程序,但无需传递它们即可访问这些集合。我正在考虑类似于webforms中的HttpContext.Current吗?

2 个答案:

答案 0 :(得分:2)

尝试,

        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);

答案 1 :(得分:0)

有一个ViewContext对象可以让你链接回你要求的大部分内容,但你真的要问自己为什么你在视图中做了所有这些。 (反正恕我直言)

编辑:我可能误解了你的问题。控制器中有一个ControllerContext,视图中有一个ViewContext。 MVC中的大多数可扩展点都有某种Context对象,可以让您获取Request及其数据。