1

除了直接在视图中工作之外,在 ASP.NET MVC 应用程序中运行时,是否有任何方法可以访问当前正在运行的请求的 FormCollection、ViewData、ModelState 等?我希望能够从视图中调用一些自定义处理程序,但无需传递它们即可访问这些集合。我在想一些类似于 HttpContext.Current 在网络表单中的东西?

4

2 回答 2

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);
于 2011-08-15T03:09:58.993 回答
0

有一个 ViewContext 对象可以让您链接回您所要求的大部分内容,但您确实必须问自己为什么要在视图中执行所有这些操作。(无论如何,恕我直言)

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

于 2011-08-14T21:18:03.340 回答