asp.net – 如何使用嵌套的视图模型获取EditorFor的数据
这是我的情况 –
我有两个嵌套的视图模型: ><%= Html.EditorFor(x => x.DisplayEntitiesWithRadioboxesViewModel)%>< br /> 它位于其父(StructureViewModel)中,我可以轻松填充嵌套的ViewModel并将其传递给主视图: 在控制器内 – 示例 var moveDepartment = new StructureViewModel(); moveDepartment.DisplayEntitiesWithRadioboxesViewModel = fullDepartmentList.Select(x => new DisplayEntityViewModel { Id = x.Id,Path = x.Path,PathLevel = x.PathLevel,Description = x.Description,}); return View(moveDepartment); EditorTemplete – 示例 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Site.Areas.Administration.ViewModel.DisplayEntityViewModel>>" %> <table class="aligncenter"><% if (Model != null) { foreach (var entity in Model) {%> <tr class="tRow"> <td style="text-align:left; text-indent:<%=Html.Encode(entity.PathLevel)%>em"> <%=Html.Encode(entity.Description)%> <%=Html.RadioButton("radiobutton",entity.Id)%> </td> </tr><% } }%> </table> namespace Site.Areas.Administration.ViewModel { public class DisplayEntityViewModel { public int Id { get; set; } public string Path { get; set; } public string PathLevel { get; set; } public string Description { get; set; } } } 但是,当我尝试撤回此信息时,嵌套的ViewModel为null: [HttpPost] public ActionResult Move(StructureViewModel StructureViewModel) 当我将鼠标悬停在StructureViewModel上时,它只包含父ViewModel中的数据集.例如:可以看到隐藏值,但DisplayEntitiesWithRadioboxesViewModel = null. 我知道如何访问DisplayEntitiesWithRadioboxesViewModel的唯一方法是使用FormCollection并遍历FormCollection并从嵌套的ViewModel中提取我需要的信息. 然而,这似乎并不正确,因为我在I处发现必须使用FormCollection中的值重新填充DisplayEntitiesWithRadioboxesViewModel,例如,如果发生错误并且需要将用户发送回同一个View. 我试过搜索网页/书籍但找不到解决方案. 有没有更好的办法? 在此先感谢您的帮助.
现在已经改变为使用DropDownFor.
{string[3]} [0] = "DisplayEntitiesWithRadioboxesViewModel.radiobutton" [1] = "Action" [2] = "OldParentId" 克莱尔:-) 解决方法
一旦你理解了它的工作原理,你的问题很常见并且很容易修复.
现在你有一个视图模型,它具有IEnumerable< T>的属性. (无论通用参数是什么).您正尝试将项目传递给视图并填充IEnumerable< T>当响应返回时使用相同的值,使用最初写入页面的值,并使用所选项目进行扩充(至少从您已发布的代码中进行扩充,这将有助于您在问题中说明您的确切意图) .您遇到的问题是您必须以可以返回的方式将这些值发送到页面. 现在让我说你可能不应该使用这种技术.通常,更好的方法是仅返回选择并在需要服务器端时再次生成列表. 从事物的外观来看,您希望返回整个列表,然后查找所选项目,即在下拉列表或单选按钮组之后.为了获得选择,控制器操作的参数必须具有与传回的变量匹配的属性.在这种情况下,看起来您使用参数名称radiobutton用于所有单选按钮(同样保持为true)对于下拉列表,只有它使用列表的名称).选择哪一个,与该名称相关联的值将以该名称返回. MVC框架负责尝试找到具有尽可能多的名称的适当操作. 您需要为action参数使用的是一个新类,它包含提交回服务器的所有字段名称的属性!或者您当然可以简单地将radiobutton属性添加到StructureViewModel中.实际上,您会注意到它已经尝试设置该值,只有它在视图模型上当前不存在.但是你仍然不会收到原始列表,但那没关系,因为即使你确实收到了原始列表,你也没有标识符让你知道选择了哪个项目! 希望这有助于您了解正在发生的事情,如果您有更多问题,请询问. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 使用linq进行Datalist分页
- asp.net-mvc – MVC DDD:可以将存储库与控制器中的服务一起
- asp.net-mvc – 如何将字符串传递给ASP.NET MVC中的部分视图
- asp.net-mvc – 跟踪登录用户
- asp.net-mvc – SelectListItem中的Selected属性永远不会起
- asp.net-mvc – 使用Windows身份验证和OWIN的ASP.NET MVC5
- asp.net-mvc – ASP.NET MVC路由:如何定义自定义路由
- asp.net – 在Repeater控件中实现功能链接
- asp.net-mvc – 创建ASP.NET MVC控件或帮助器的最佳实践是什
- asp.net-mvc – 从WebAPI生成MVC控制器操作的路由URL
- asp.net-mvc – MVC DDD:可以将存储库与控制器中
- 与asp.net mvc的dotnetopenauth证明太沮丧使用
- asp.net – TransferRequestHandler和BeginReque
- asp.net-web-api – System.Web.Http.WebHost中的
- CommandArgument(与ASP.NET Repeater一起使用)是
- 剃刀 – MVC布局VS MVC主页
- asp.net-mvc-4 – visual studio 2012 RC无法加载
- asp.net – 拥有专用应用程序池,将Web应用程序保
- asp.net – Razor base type / Templated Razor使
- asp.net – HTML源代码中的大型viewstate