- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 Mel 空间中建议的解决方案 ( https://mleeb.wordpress.com/2013/11/23/editing-nested-lists-in-asp-mvc-4/ )用于编辑嵌套列表
基本上我的模型如下
ProductEditModel
--> ProductAudioEditModel
--> ProductAssetResourceEditModel
我得到了下面的工作
@Html.EditorFor(c => resource.TrackTitle, null, Html.GetHtmlName("TrackTitle"))
它在编辑时给了我正确的值。
但是,我无法为 DropDownList 工作,或者我无法在 dropdownlist 中选择编辑后的值。它总是给我 Controller 中的原始值。
@using (Html.BeginCollectionItem("ProductAssetAudios", out parentIdentifier))
{
.....
@foreach (var resource in Model.ProductAssetResources.OrderBy(a => a.ResourceNumber))
{
string childIdentifier = null;
@using (Html.BeginChildCollectionItem("ProductAssetResources", parentIdentifier, out childIdentifier))
{
@Html.HiddenFor(model => resource.AssetResourceStatusId, new { Name = Html.GetHtmlName(childIdentifier, "AssetResourceStatusId") })
@Html.DropDownListFor(model => resource.AssetResourceStatusId, new SelectList(visibleResourceStatuses, "AssetResourceStatusId", "Name", resource.AssetResourceStatusId), new { @class = "inherit-title" }) @Html.ValidationMessageFor(model => resource.AssetResourceStatusId)
}
}
}
即使为不同的值选择了下拉列表,AssetResourceStatusId 始终保持原始值。
我希望编辑嵌套列表时 EditorFor 和 DropDownListFor 应该以相同的方式工作。
生成的 HTML
<select class="inherit-title valid" id="ProductAssetAudios_0df86a5c-0a32-4b0f-97ee-3b3254f743d9__ProductAssetResources_c58ba43c-6081-41d4-88fd-d59799c7374e__resource_AssetResourceStatusId" name="ProductAssetAudios[0df86a5c-0a32-4b0f-97ee-3b3254f743d9].ProductAssetResources[c58ba43c-6081-41d4-88fd-d59799c7374e].resource.AssetResourceStatusId" aria-invalid="false"><option value="3">Extra</option>
<option selected="selected" value="2">Found</option>
<option value="8">Ignore</option>
</select>
<input name="ProductAssetAudios[b5670a6a-7a1d-4c76-86bc-85a05cd144c1].ProductAssetResources[aa378d38-0fb7-4304-9f24-79d0efcb36b9].AssetResourceStatusId" data-val="true" data-val-number="The field AssetResourceStatusId must be a number." data-val-required="The AssetResourceStatusId field is required." id="ProductAssetAudios_b5670a6a-7a1d-4c76-86bc-85a05cd144c1__ProductAssetResources_aa378d38-0fb7-4304-9f24-79d0efcb36b9__resource_AssetResourceStatusId" type="hidden" value="2">
-艾伦-
最佳答案
您的模型包含一个名为 ProductAssetAudios
的集合属性(typeof ProductAudioEditModel
),并且该集合中的每个对象都包含一个名为 ProductAssetResources
的集合属性(typeof ProductAssetResourceEditModel
),每个对象都包含一个名为 AssetResourceStatusId
的属性。
在 C# 代码中,如果您要获取第一个 ProductAudioEditModel
中第一个 ProductAssetResourceEditModel
的 AssetResourceStatusId
值,您的代码将是
var id = model.ProductAssetAudios[0].ProductAssetResources[0].AssetResourceStatusId;
删除 model
前缀,这正是控件的 name
属性必须的样子。 BeginCollectionItem()
和 BeginChildCollectionItem()
方法所做的是将集合索引器修改为 Guid
并将索引器的隐藏输入添加到允许您从集合中动态添加和删除项目。默认情况下,DefaultModelBinder
将使用从零开始的连续索引器绑定(bind)集合,除非还发布了索引器的值(即添加隐藏输入的原因)。
在您的情况下,隐藏输入的 name
属性是正确的,即使用
@Html.HiddenFor(model => resource.AssetResourceStatusId, new { Name = Html.GetHtmlName(childIdentifier, "AssetResourceStatusId") })
因为您覆盖了 HiddenFor()
生成的默认 name
属性。您只需对 DropDownListFor()
方法执行相同的操作,即使用 new { Name = Html.GetHtmlName(childIdentifier, "AssetResourceStatusId") }
设置名称属性。但是随后您还需要删除隐藏的输入,因为 DefaultModelBinder
只会绑定(bind)为属性发布的第一个值。另请注意,您还需要更改 ValidationMessageFor()
。
边注。从评论看来,您不想在 View 中添加和删除项目,在这种情况下,请勿使用 BeginCollectionItem()
和 BeginChildCollectionItem()
方法。相反,只需使用嵌套的 for
循环或自定义 EditorTemplates
typeof ProductAudioEditModel
和 ProductAssetResourceEditModel
。使用 for
循环的一个例子是
for(int i = 0; i < Model.ProductAssetAudios.Count; i++)
{
@Html.TextBoxFor(m => m.ProductAssetAudios[i].SomeProperty)
....
for (int j = 0; j < Model.ProductAssetAudios[i].ProductAssetResources.Count; j++)
{
@Html.DropDownListFor(m => m.ProductAssetAudios[i].ProductAssetResources[j].AssetResourceStatusId, new SelectList(.....)
另请参阅 this answer有关使用嵌套 EditorTemplate
的示例。
关于c# - ASP.NET MVC 绑定(bind)嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37505748/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!