2011-08-14 63 views
1

當在ASP.NET MVC應用程序中運行而不是直接工作時,是否有任何方式可以訪問當前正在運行的請求的FormCollection,ViewData,ModelState等在視圖?我希望能夠從視圖中調用一些自定義處理程序,但無需傳遞它們即可訪問這些集合。我想在webforms中類似於HttpContext.Current?如何訪問FormCollection,ViewData和ModelState

回答

0

有一個ViewContext對象,可以讓你鏈接到你所要求的大部分內容,但你必須問自己爲什麼你要在視圖中做所有這些。 (恕我直言,無論如何)

編輯:我可能誤讀你的問題。控制器中有一個ControllerContext,視圖中有一個ViewContext。 MVC中的大多數可擴展點都有某種Context對象,可以讓您獲取Request及其數據。

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