加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 06:43:40 所属栏目:asp.Net 来源:网络整理
导读:这是我的情况 – 我有两个嵌套的视图模型: %= Html.EditorFor(x = x.DisplayEntitiesWithRadioboxesViewModel)% br / 它位于其父(StructureViewModel)中,我可以轻松填充嵌套的ViewModel并将其传递给主视图: 在控制器内 – 示例 var moveDepartment = new
这是我的情况 –

我有两个嵌套的视图模型:

><%= 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.

我试过搜索网页/书籍但找不到解决方案.

有没有更好的办法?

在此先感谢您的帮助.

And why did you use an EditorFor for a
simple dropdown,which is easily to
use with DropDownFor

现在已经改变为使用DropDownFor.

what is the Key of the
DisplayEntitiesWithRadioboxesViewModel
value in FormCollection

{string[3]}
[0] = "DisplayEntitiesWithRadioboxesViewModel.radiobutton"
[1] = "Action"
[2] = "OldParentId"

克莱尔:-)

解决方法

一旦你理解了它的工作原理,你的问题很常见并且很容易修复.

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

现在让我说你可能不应该使用这种技术.通常,更好的方法是仅返回选择并在需要服务器端时再次生成列表.

从事物的外观来看,您希望返回整个列表,然后查找所选项目,即在下拉列表或单选按钮组之后.为了获得选择,控制器操作的参数必须具有与传回的变量匹配的属性.在这种情况下,看起来您使用参数名称radiobutton用于所有单选按钮(同样保持为true)对于下拉列表,只有它使用列表的名称).选择哪一个,与该名称相关联的值将以该名称返回. MVC框架负责尝试找到具有尽可能多的名称的适当操作.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读