c# – 带继承的MVC Complex模型绑定,嵌套的viewModels和部分视图
发布时间:2020-12-16 00:25:04 所属栏目:百科 来源:网络整理
导读:我无法将嵌套模型的值恢复到控制器,它们都是空值. 这是简化的架构: //The viewModel being passed to the viewpublic class RunnerIndexViewModel{ public RegisterViewModel User { get; set; } public TrainerViewModel TrainerVM { get; set; } public R
我无法将嵌套模型的值恢复到控制器,它们都是空值.
这是简化的架构: //The viewModel being passed to the view public class RunnerIndexViewModel { public RegisterViewModel User { get; set; } public TrainerViewModel TrainerVM { get; set; } public RunnerBase Runner { get; set; } [Display(Name = "AddContact",ResourceType = typeof(MyRessources))] public bool AddContact { get; set; } } public class RegisterViewModel { // various simple type properties here } public class TrainerViewModel { // various properties here public Unit unit { get; set; } public List<SelectListItem> ListStatut { get; set; } } public abstract partial class RunnerBase { // entity framework class with associations } public class RedRunner : RunnerBase { // entity framework class with associations } public class BlueRunner : RunnerBase { // entity framework class with associations } 以下是从控制器接收模型的主视图(简化): @model Web.Models.Fournisseurs.FournisseurIndexViewModel @using (Html.BeginForm()) { @Html.AntiForgeryToken() @Html.Partial("PartialTrainer",Model.TrainerVM) @Html.Partial("PartialRunner",Model.Runner as RedRunner) @Html.Partial("PartialUser",Model.User) } PartialTrainer和PartialUser的观点没什么特别之处,所以这里是从实体框架中获取基类的PartialRunner视图: @model RunnerBase @* Show Various fields from RunnerBase ... *@ @if (Model is RedRunner) { @* show properties specific to RedRunner *@ } else if (Model is BlueRunner) { @* show properties specific to BlueRunner *@ } 从控制器我将RedRunner或BlueRunner传递给Runner属性.所有viewModel的所有字段都显示良好,但在提交表单时,我只设法获取AddContact值… 如何获取其他视图模型的值以及Runner类中的值? 解决方法
问题在于使用partials.每次进入部分时,模型上下文都会发生变化,因此Razor为您生成的输入不会考虑完整的属性路径.例如,如果要在主视图中执行以下操作:
@Html.EditorFor(m => m.TrainerVM.SomeProperty) 生成的HTML类似于: <input type="text" name="TrainerVM.SomeProperty" /> 但是,当使用partial时,您的助手将被称为: @Html.EditorFor(m => m.SomeProperty) 生成的HTML将类似于: <input type="text" name="SomeProperty" /> 一旦将其发回,模型绑定器就不知道SomeProperty属于TrainerVM实例,因此它无法确定绑定发布值的位置,最终会出现空值.要继续使用partials而不是侧面解决此问题,您需要传递ViewData.TemplateInfo.HtmlFieldPrefix的值(用于正确添加部分中所有字段的名称): @Html.Partial("PartialTrainer",Model.TrainerVM,new ViewDataDictionary(ViewData) { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "TrainerVM" } }) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ruby-on-rails – 用于Ruby on Rails开发人员的ASP.NET MVC
- ruby-on-rails – Evercookie for rails
- 解析oracle 9i以前版本加密文件
- ruby-on-rails – 为什么“rails server -e production”使
- 笔记1:“请求/响应”模型
- objective-c – 在C中执行复数的矩阵运算
- 列出.NET程序所依赖的Assembly
- 自己写的操纵SQLite数据库的SQLHelper,备忘的-_-(VS2005 C#
- swift – “Collection where Indices.Iterator.Element ==
- Bitmap Font Generator(bmfont.exe)工具修改以支持Cocos St