Cla*_*ear 5 asp.net viewmodel asp.net-mvc-2
这是我的情况 -
我有两个嵌套视图模型:
<%=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)
克莱尔:-)
您的问题很常见,一旦您了解了它的工作原理,就很容易解决。
\n\n现在你有一个视图模型,它有一个属性IEnumerable<T>(与通用参数是什么无关)。\xc2\xa0您正在尝试将项目传递到视图,并IEnumerable<T>在响应返回时使用最初写入页面的值填充相同的值,并使用所选项目进行扩充(至少从您发布的代码中)无论如何,这将有助于您在问题中陈述您的确切意图)。\xc2\xa0 这里遇到的问题是,您必须以可以返回这些值的方式将这些值发送到页面。
现在我想说的是,您可能不应该使用这种技术。\xc2\xa0 如果您需要服务器端,则仅返回选择并再次生成列表通常是一个更好的主意。
\n\n从表面上看,您想要返回整个列表,然后查找选定的项目,这毕竟是下拉列表或单选按钮组的要点。\xc2\xa0为了恢复选择,控制器操作的参数必须具有与传回的变量相匹配的属性。\xc2\xa0在这种情况下,看起来您正在使用radiobutton所有单选按钮的参数名称(下拉列表也是如此,只是它使用列表的名称)。\xc2\xa0无论选择哪一个,都会以该名称返回与其关联的值。\xc2\xa0MVC 框架负责尝试找到指定了尽可能多的名称的适当操作。\xc2\xa0
您的操作参数需要使用一个新类,其中包含提交回服务器的所有字段名称的属性!\xc2\xa0或者当然你也可以简单地将radiobutton属性添加到你的StructureViewModel。\xc2\xa0事实上,您会注意到它已经在尝试设置该值,只是它当前不存在于您的视图模型中。\xc2\xa0 不过,您仍然不会收到原始列表,但这没关系,因为即使您确实收到了原始列表,上面也没有标识符来让您知道选择了哪个项目!
希望这可以帮助您了解正在发生的事情,如果您有更多问题,请询问。
\n| 归档时间: |
|
| 查看次数: |
4327 次 |
| 最近记录: |