我正在尝试在内存中构建一个对象/模型,它表示当前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
中的值读入临时对象的位置,以便我可以访问它们并重建服务器端的问题,以便在视图中正确呈现。