Mvc List Strongly type View DropDownListFor 不显示当前值
Mvc List Strongly type View DropDownListFor not showing current value
我有以下dropdownlistfor
控件
@Html.DropDownListFor(m => item.RelationShipId, new SelectList(ViewBag.RelationShip,"Id", "Title"), new { @id = "ddl_" + @item.UserID, @class = "form-control", onchange = "update(this,'" + @item.UserID + "','" + @item.SentByUserId + "');" })
我像这样绑定这个强类型视图@model List<MvcUI.Models.UserDetails>
在 ViewBag.RelationShip
我有以下列表
public static List<IDTitleDTO> DataTableToRelationshipList(this DataTable table)
{
var list = table.AsEnumerable()
.Select(dr =>
new IDTitleDTO
{
Id = dr.Field<int>("RelationShipId"),
Title = dr.Field<string>("RelationShipName")
}).ToList();
return list;
}
我正在将 UserDetails
模型列表传递给我的视图。这是我的 UserDetails
模型
public class UserFriendDetails
{
public string UserID { get; set; }
public string UserName { get; set; }
public string Firstname { get; set; }
public int? RelationShipId { get; set; }
....
...
Other fields
}
假设在一个列表中我有 3 条记录。其中 2 条记录 RelationShipId 为空。如果它为空,那么我将设置 -1,即 -- Select --。在剩下的一条记录中,我有 RelationShipId 假设我有 13。当视图打开时它绑定 - Select - 用于前两条记录。但是对于第三条记录,它没有绑定来自 ViewBag 的适当值。我无法弄清楚问题出在哪里。有人可以帮我解决这个问题吗?
编辑
这里我创建了一个简单的操作,即用户
[AllowAnonymous]
public ActionResult User()
{
var model = new List<UserDetails>();
model.Add(new UserDetails { Id = 1, Fname = "ajay", RelationId = 3});
model.Add(new UserDetails { Id = 2, Fname = "vijay", RelationId = 1 });
model.Add(new UserDetails { Id = 3, Fname = "John", RelationId = 2 });
var rList = new List<IdTitleDTO>();
rList.Add(new IdTitleDTO { Id = 1 , Title = "M"});
rList.Add(new IdTitleDTO { Id = 2, Title = "F" });
rList.Add(new IdTitleDTO { Id = 3, Title = "B" });
ViewBag.Rel = rList;
return View(model);
}
这是我的 user.cshtml
@model List<WebApplicationDropDown.Models.UserDetails>
<table class="table">
<tr>
<th>
Fname
</th>
<th></th>
</tr>
@*@foreach (var item in Model) {*@
@for (int i = 0; i < Model.Count(); i++)
{
<tr>
<td>
@Html.DisplayFor(modelItem => Model[i].Fname)
</td>
<td>
@Html.DropDownListFor(modelItem => Model[i].RelationId, new SelectList(ViewBag.Rel, "Id", "Title"), "--Select--")
</td>
</tr>
}
</table>
在此视图中,它未绑定 relationId。默认情况下它显示 -- Select --
而不是显示以下关系
ajay - B
Vijay - M
John - F
请看下图
新编辑
编辑器模板 UserDetails。cshtml
@model WebApplicationDropDown.Models.UserDetails
@Html.DropDownListFor(m => m.RelationId, (SelectList)ViewData["RelationShipList"])
View.cshtml
@model IEnumerable<WebApplicationDropDown.Models.UserDetails>
<table class="table">
<tr>
<th>
Fname
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Fname)
</td>
<td>
@*@Html.DropDownListFor(modelItem => item.RelationId, new SelectList(ViewBag.Rel, "Id", "Title"), "--Select--")*@
@Html.EditorFor(m => m, new { RelationShipList = new SelectList(ViewBag.Rel, "Id", "Title") })
</td>
</tr>
}
</table>
请看下面的截图
正如我在评论中提到的,我不太明白你在问什么,但我能弄清楚的是你在这里做错了几件事。
首先,您不应该使用“-1”作为默认值。您使用的是可以为空的字段 RelationShipId,当您希望取消选择时,您应该将 RelaitonShipId 设置为空,然后使用 "option label" 默认值DropDownListFor 的字符串参数,用于为此放置文本。
@Html.DropDownListFor(m => item.RelationShipId,
new SelectList(ViewBag.RelationShip,"Id", "Title"),
"--Select--",
new { @id = "ddl_" + @item.UserID, @class = "form-control",
onchange = "update(this,'" + @item.UserID + "','" + @item.SentByUserId + "');" })
这允许模型绑定和验证工作,因此如果您有一个必需的验证,如果 RelationShipId 为 null(选择“--Select--”)那么它将无法验证。
为 UserFriendDetails
类型创建自定义 EditorTemplate
在/Views/Shared/EditorTemplates/UserFriendDetails.cshtml
@model UserFriendDetails
@Html.TextBoxFor(m => m.UserName)
....
@Html.DropDownLstFor(m => m.RelationShipId, (SelectList)ViewData["RelationShipList"])
然后在主视图中,使用附加视图数据
将SelectList
传递给模板
@model IEnumerable<UserFriendDetails>
....
@Html.EditorFor(m => m, new { RelationShipList = new SelectList(ViewBag.RelationShip,"Id", "Title") })
这将生成正确的名称属性以绑定到您的集合,例如
<select name="[0].RelationShipId" ..>
<select name="[1].RelationShipId" ..>
和 select 正确选项基于每个 RelationShipId
属性.
的值
旁注:我建议您删除 new { @id = "ddl_" + @item.UserID,...
并使用助手生成的默认 id
。不清楚 onchange
属性在做什么,但我也建议您使用 unobtrusive javascript 而不是用行为污染您的标记。
我在 View
上尝试了多个下拉菜单的解决方案
<select class="form-control" id="ddl_@item.UserID" name="ddl_@item.UserID" onchange = "update(this,'@item.UserID','@item.SentByUserId');">
@foreach (var rel in listRelations)
{
<option @if (string.Compare(item.RelationShipId.ToString(), rel.Id.ToString(), true) == 0)
{ @Html.Raw("selected") } value="@rel.Id">@rel.Title</option>
}
</select>
此处 listRelations
是 ViewBag
类型 var listRelations = ViewBag.RelationShip as List<IDTitleDTO>;
我有以下dropdownlistfor
控件
@Html.DropDownListFor(m => item.RelationShipId, new SelectList(ViewBag.RelationShip,"Id", "Title"), new { @id = "ddl_" + @item.UserID, @class = "form-control", onchange = "update(this,'" + @item.UserID + "','" + @item.SentByUserId + "');" })
我像这样绑定这个强类型视图@model List<MvcUI.Models.UserDetails>
在 ViewBag.RelationShip
我有以下列表
public static List<IDTitleDTO> DataTableToRelationshipList(this DataTable table)
{
var list = table.AsEnumerable()
.Select(dr =>
new IDTitleDTO
{
Id = dr.Field<int>("RelationShipId"),
Title = dr.Field<string>("RelationShipName")
}).ToList();
return list;
}
我正在将 UserDetails
模型列表传递给我的视图。这是我的 UserDetails
模型
public class UserFriendDetails
{
public string UserID { get; set; }
public string UserName { get; set; }
public string Firstname { get; set; }
public int? RelationShipId { get; set; }
....
...
Other fields
}
假设在一个列表中我有 3 条记录。其中 2 条记录 RelationShipId 为空。如果它为空,那么我将设置 -1,即 -- Select --。在剩下的一条记录中,我有 RelationShipId 假设我有 13。当视图打开时它绑定 - Select - 用于前两条记录。但是对于第三条记录,它没有绑定来自 ViewBag 的适当值。我无法弄清楚问题出在哪里。有人可以帮我解决这个问题吗?
编辑
这里我创建了一个简单的操作,即用户
[AllowAnonymous]
public ActionResult User()
{
var model = new List<UserDetails>();
model.Add(new UserDetails { Id = 1, Fname = "ajay", RelationId = 3});
model.Add(new UserDetails { Id = 2, Fname = "vijay", RelationId = 1 });
model.Add(new UserDetails { Id = 3, Fname = "John", RelationId = 2 });
var rList = new List<IdTitleDTO>();
rList.Add(new IdTitleDTO { Id = 1 , Title = "M"});
rList.Add(new IdTitleDTO { Id = 2, Title = "F" });
rList.Add(new IdTitleDTO { Id = 3, Title = "B" });
ViewBag.Rel = rList;
return View(model);
}
这是我的 user.cshtml
@model List<WebApplicationDropDown.Models.UserDetails>
<table class="table">
<tr>
<th>
Fname
</th>
<th></th>
</tr>
@*@foreach (var item in Model) {*@
@for (int i = 0; i < Model.Count(); i++)
{
<tr>
<td>
@Html.DisplayFor(modelItem => Model[i].Fname)
</td>
<td>
@Html.DropDownListFor(modelItem => Model[i].RelationId, new SelectList(ViewBag.Rel, "Id", "Title"), "--Select--")
</td>
</tr>
}
</table>
在此视图中,它未绑定 relationId。默认情况下它显示 -- Select --
而不是显示以下关系
ajay - B
Vijay - M
John - F
请看下图
新编辑
编辑器模板 UserDetails。cshtml
@model WebApplicationDropDown.Models.UserDetails
@Html.DropDownListFor(m => m.RelationId, (SelectList)ViewData["RelationShipList"])
View.cshtml
@model IEnumerable<WebApplicationDropDown.Models.UserDetails>
<table class="table">
<tr>
<th>
Fname
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Fname)
</td>
<td>
@*@Html.DropDownListFor(modelItem => item.RelationId, new SelectList(ViewBag.Rel, "Id", "Title"), "--Select--")*@
@Html.EditorFor(m => m, new { RelationShipList = new SelectList(ViewBag.Rel, "Id", "Title") })
</td>
</tr>
}
</table>
请看下面的截图
正如我在评论中提到的,我不太明白你在问什么,但我能弄清楚的是你在这里做错了几件事。
首先,您不应该使用“-1”作为默认值。您使用的是可以为空的字段 RelationShipId,当您希望取消选择时,您应该将 RelaitonShipId 设置为空,然后使用 "option label" 默认值DropDownListFor 的字符串参数,用于为此放置文本。
@Html.DropDownListFor(m => item.RelationShipId,
new SelectList(ViewBag.RelationShip,"Id", "Title"),
"--Select--",
new { @id = "ddl_" + @item.UserID, @class = "form-control",
onchange = "update(this,'" + @item.UserID + "','" + @item.SentByUserId + "');" })
这允许模型绑定和验证工作,因此如果您有一个必需的验证,如果 RelationShipId 为 null(选择“--Select--”)那么它将无法验证。
为 UserFriendDetails
EditorTemplate
在/Views/Shared/EditorTemplates/UserFriendDetails.cshtml
@model UserFriendDetails
@Html.TextBoxFor(m => m.UserName)
....
@Html.DropDownLstFor(m => m.RelationShipId, (SelectList)ViewData["RelationShipList"])
然后在主视图中,使用附加视图数据
将SelectList
传递给模板
@model IEnumerable<UserFriendDetails>
....
@Html.EditorFor(m => m, new { RelationShipList = new SelectList(ViewBag.RelationShip,"Id", "Title") })
这将生成正确的名称属性以绑定到您的集合,例如
<select name="[0].RelationShipId" ..>
<select name="[1].RelationShipId" ..>
和 select 正确选项基于每个 RelationShipId
属性.
旁注:我建议您删除 new { @id = "ddl_" + @item.UserID,...
并使用助手生成的默认 id
。不清楚 onchange
属性在做什么,但我也建议您使用 unobtrusive javascript 而不是用行为污染您的标记。
我在 View
<select class="form-control" id="ddl_@item.UserID" name="ddl_@item.UserID" onchange = "update(this,'@item.UserID','@item.SentByUserId');">
@foreach (var rel in listRelations)
{
<option @if (string.Compare(item.RelationShipId.ToString(), rel.Id.ToString(), true) == 0)
{ @Html.Raw("selected") } value="@rel.Id">@rel.Title</option>
}
</select>
此处 listRelations
是 ViewBag
类型 var listRelations = ViewBag.RelationShip as List<IDTitleDTO>;