c# MVC中的DropDownListFor可编辑记录表
本文关键字:编辑 记录表 DropDownListFor MVC 中的 | 更新日期: 2023-09-27 18:15:04
我不确定这是否可能,并且没有发现任何类似的问题。
我们有一个编辑视图,它不是针对单个记录,而是针对"父"记录的多个成员。这些"子"记录需要一起编辑(同时). ...如果可能的话。
这些"子"记录中的每个字段都是对另一个表的引用,因此需要一个选择列表。我们在所有的标准编辑视图中使用DropDownListFor,并且单个记录编辑得很好。
我们的模型是:
[Display(Name = "Team Member")]
public int Contact_ID { get; set; }
[Display(Name = "Team Member")]
public String Contact_Name { get; set; }
[Display(Name = "Type/Role")]
public int MemberTypeLookUp_ID { get; set; }
[Display(Name = "Type/Role")]
public String MemberTypeValue { get; set; }
[Display(Name = "Type/Role")]
public LookUpList MemberTypeLookUp { get; set; }
我们通过select从数据库表中检索前4个字段。直接和OK..
我们设置DropDownListFor的代码是:(编辑:在foreach()循环中添加了新代码,以手动设置每个列表中相关选项的. selected属性为true。这仍然不能转换为实际显示的视图…)
foreach (TeamEditViewItem tevi in this.members)
{
tevi.MemberTypeLookUp = new LookUpList("TeamMemberType");
foreach (SelectListItem item in tevi.MemberTypeLookUp.list)
{
if (item.Value == tevi.MemberTypeLookUp_ID.ToString())
{
item.Selected = true;
break;
}
}
}
为了完成这个问题,LookUpList代码是:
public class LookUpList
{
public SelectList list;
// Return all Active LookUp entries for the passed-in Category.
public LookUpList(String Category)
{
WorkpointContext _db = new WorkpointContext();
int Customer_ID = _db.GetCustomer_ID();
IList<LookUp> items = (from lookup in _db.LookUp
where (lookup.Category == Category)
&& (lookup.IsActive == true)
orderby lookup.DisplayOrder ascending
select lookup).ToList();
this.list = new SelectList(items, "ID", "Value");
}
}
如前所述,LookUpList代码适用于标准Edit View中的单个记录。
呈现页面后,我们列出了多个"子"记录,但是DropDown List并不保存每个记录的现有值。(这是一个编辑而不是创建,所以值已经通过默认值和其他逻辑分配-而不是通过创建视图上的下拉列表。)
当查看页面的源代码时,我可以看到每个下拉列表都有自己的ID。
我有一种感觉,我们的问题是由于页面上的多个DropDownListFor对象,但不能弄清楚问题是什么,为什么我们有这个问题。
我们的视图有简单的下拉列表代码:
@Html.DropDownListFor(model => model.members[i].MemberTypeLookUp_ID, Model.members[i].MemberTypeLookUp.list, "--Select--")
@Html.ValidationMessageFor(model => model.members[i].MemberTypeLookUp_ID)
添加第三个参数是因为我们总是在下拉列表中获得第一个选项,并且需要确定是否有值。我们经常在下拉列表中显示"——选择——"选项,这是一个占位符,而不是一个有效的选项-因此显示验证消息。
(编辑)我已经添加了完整的编辑视图cshtml代码:
@model WebWorkPoint.Models.TeamEditView
<h3>Edit Team</h3>
@using (Html.BeginForm()) {
<fieldset>
@if (Model.members.Count>0)
{
<table>
<!-- table headings -->
<thead>
<tr>
<td style="text-align:center; border-bottom: 1px solid black; " >
<div class='editor-label'>
@Html.LabelFor(m => m.members.First().Contact_Name)
</div>
</td>
<td class="spacer-border"> </td>
<td style="text-align:center; border-bottom: 1px solid black; " >
<div class='editor-label'>
@Html.LabelFor(m => m.members.First().MemberTypeValue)
</div>
</td>
</tr>
</thead>
<!-- table rows -->
<tbody>
@for (int i = 0; i < Model.members.Count; i++)
{
<tr>
<td style="text-align:center; " >
@Html.HiddenFor(m => m.members[i].Contact_ID)
<div class="editor-field">
@Html.EditorFor(m => m.members[i].Contact_Name)
@Html.ValidationMessageFor(model => model.members[i].Contact_Name)
</div>
</td>
<td class="spacer"></td>
<td style="text-align:center; " >
<div class="editor-field">
@Html.DropDownListFor(model => model.members[i].MemberTypeLookUp_ID, Model.members[i].MemberTypeLookUp.list, "--Select--")
@Html.ValidationMessageFor(model => model.members[i].MemberTypeLookUp_ID)
</div>
</td>
</tr>
}
</table>
}
else
{
<p>There are currently no team members defined.</p>
}
<p>
<input type="submit" value="Update Team" />
@{
sAction = "/" + Model.TableNameValue + "/" + Model.TableNameValue + "Show/" + Model.TableRecord_ID.ToString();
sLinkText = "Cancel";
}
<button type="button" onclick="location.href='@sAction'" >@sLinkText</button>
</p>
</fieldset>
}
(结束编辑)
有谁能对我们的问题说明一下吗?提前感谢您的帮助看了这个关于Stack Overflow的回答后,我们决定尝试同样的解决方法。
结果是,FULL分辨率如下:
-
我们仍然需要在设置代码中设置LookUpList(但不需要尝试任何选择代码):
// other code above ... foreach (TeamEditViewItem tevi in this.members) { tevi.MemberTypeLookUp = new LookUpList("TeamMemberType"); }
-
LookUpList()代码根据原始问题/问题创建SelectList -无需更改。
-
我们还需要替换编辑视图上的DropDownListFor()调用:
@Html.DropDownListFor(model => model.members[i].MemberTypeLookUp_ID, new SelectList(Model.members[i].MemberTypeLookUp.list, "Value", "Text", Model.members[i].MemberTypeLookUp_ID), "--Select--")
这似乎是重复或多余的,但这是需要的。也许我们可以做些什么来进一步清理它,但它现在"没有坏",所以为什么要尝试修复它呢?
我必须感谢@Stephen Muecke和@Mario Lopez的投入,让我们从我们正在做的事情中调查和思考得更远。同时,感谢@ataravati解决了上面链接的其他问题,让我们尝试其他方法。
希望我们的问题和解决方案可以帮助其他程序员…
我认为正在发生的事情是所有的下拉菜单都是用相同的Id = MemberTypeLookUp_ID生成的。我要做的是为子创建一个局部视图,并从foreach中的主视图调用它,并将必须填充的子模型传递给这个局部视图,而不是整个父模型。