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