如何使用嵌套视图模型获取EditorFor的数据

Cla*_*ear 5 asp.net viewmodel asp.net-mvc-2

这是我的情况 -

我有两个嵌套视图模型:

  1. <%=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);
Run Code Online (Sandbox Code Playgroud)

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; }   
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试拉回此信息时,嵌套的 ViewModel 为空:

[HttpPost]
public ActionResult Move(StructureViewModel StructureViewModel)
Run Code Online (Sandbox Code Playgroud)

当我将鼠标悬停在其上时,StructureViewModel它仅包含父 ViewModel 中的数据集。例如:可以看到隐藏值,但 DisplayEntitiesWithRadioboxesViewModel = null。

我知道如何访问的唯一方法DisplayEntitiesWithRadioboxesViewModel是使用FormCollection和迭代FormCollection并从嵌套的 ViewModel 中提取我需要的信息。

然而,这似乎并不正确,正如我发现的那样,如果发生错误并且需要将用户发送回同一视图,则必须使用 中的DisplayEntitiesWithRadioboxesViewModel值重新填充 。FormCollection

我尝试搜索网络/书籍但找不到解决方案。

有没有更好的办法?

预先感谢您的任何帮助。

为什么使用 EditorFor 来实现简单的下拉菜单,它可以轻松地与 DropDownFor 一起使用

现在已更改为使用 DropDownFor。

FormCollection 中 DisplayEntitiesWithRadioboxesViewModel 值的键是什么

{string[3]}
[0] = "DisplayEntitiesWithRadioboxesViewModel.radiobutton"
[1] = "Action"
[2] = "OldParentId"
Run Code Online (Sandbox Code Playgroud)

克莱尔:-)

Nic*_*sen 3

您的问题很常见,一旦您了解了它的工作原理,就很容易解决。

\n\n

现在你有一个视图模型,它有一个属性IEnumerable<T>(与通用参数是什么无关)。\xc2\xa0您正在尝试将项目传递到视图,并IEnumerable<T>在响应返回时使用最初写入页面的值填充相同的值,并使用所选项目进行扩充(至少从您发布的代码中)无论如何,这将有助于您在问题中陈述您的确切意图)。\xc2\xa0 这里遇到的问题是,您必须以可以返回这些值的方式将这些值发送到页面。

\n\n

现在我想说的是,您可能应该使用这种技术。\xc2\xa0 如果您需要服务器端,则仅返回选择并再次生成列表通常是一个更好的主意。

\n\n

从表面上看,您想要返回整个列表,然后查找选定的项目,这毕竟是下拉列表或单选按钮组的要点。\xc2\xa0为了恢复选择,控制器操作的参数必须具有与传回的变量相匹配的属性。\xc2\xa0在这种情况下,看起来您正在使用radiobutton所有单选按钮的参数名称(下拉列表也是如此,只是它使用列表的名称)。\xc2\xa0无论选择哪一个,都会以该名称返回与其关联的值。\xc2\xa0MVC 框架负责尝试找到指定了尽可能多的名称的适当操作。\xc2\xa0

\n\n

您的操作参数需要使用一个新类,其中包含提交回服务器的所有字段名称的属性!\xc2\xa0或者当然你也可以简单地将radiobutton属性添加到你的StructureViewModel。\xc2\xa0事实上,您会注意到它已经在尝试设置该值,只是它当前不存在于您的视图模型中。\xc2\xa0 不过,您仍然不会收到原始列表,但这没关系,因为即使您确实收到了原始列表,上面也没有标识符来让您知道选择了哪个项目!

\n\n

希望这可以帮助您了解正在发生的事情,如果您有更多问题,请询问。

\n