您能否基于当前的ModelState

时间:2016-01-05 20:29:38

标签: c# asp.net-mvc model-binding

我正在尝试在内存中构建一个对象/模型,它表示当前ModelState被认为是正确的并且被合并到模型中时模型的样子。

我想我会查看TryUpdateModel()UpdateModel()的源代码,并提出以下建议:

private T GetTempModel<T>(T model, ActionExecutedContext filterContext)
        {
            var mtype = Type.GetType(model.GetType().FullName);
            var m = Activator.CreateInstance(mtype);
            var binder = ModelBinders.Binders.GetBinder(mtype);

            var bc = new ModelBindingContext()
            {
                ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => m, mtype),
                ModelName = null,
                ModelState = filterContext.Controller.ViewData.ModelState, 
                ValueProvider = filterContext.Controller.ValueProvider
            };

            var result = binder.BindModel(filterContext.Controller.ControllerContext, bc);
            return (T)result;

        }

但是当我这样做时,result值只是我运行CreateInstance()时创建的默认状态。它没有合并ModelState中的所有建议值。

我是否误解了这应该如何运作?有没有办法以对象形式ModelState而不是KeyValuePair获取项目的模型表示?

更新:每条评论的附加信息。

我正在简化这一点,但这是我正在做的事情的基本情景。假设我有一个调查申请表。用户登录并显示基本视图,他们在其中输入他们的个人资料信息(名字,姓氏等)。用于生成此视图的viewModel具有一个属性SurveyQuestions,该属性初始化时没有任何问题。当他们浏览下一个屏幕时会提示他们提问,这些问题是出于性能原因通过AJAX加载到View / DOM中的,因为他们回答了我抓住下一个适用问题的一个问题。

当用户完成并对调查进行POST时,我会在ViewModel中获得所有内容,并且SurveyQuestions我可以看到他们所有的问题/答案信息(List<QuestionBlock>)。

但是我使用Post-Redirect-Get(PRG)模式,如果在POST期间出现异常,我会存储ModelState,重定向,并在退出GET时重新应用ModelState。问题是在GET中,ViewModel只是未初始化且空的问题SurveyQuestions属性。因此,在呈现视图时,ModelState的{​​{1}}值未正确初始化。呈现视图时,所有其他属性都会获得正确的SurveyQuestions值。

这是因为我必须在退出GET之前初始化用户的ModelState以获取每个问题信息。

这是我想将SurveyQuestions中的值读入临时对象的位置,以便我可以访问它们并重建服务器端的问题,以便在视图中正确呈现。

0 个答案:

没有答案