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>

此处 listRelationsViewBag 类型 var listRelations = ViewBag.RelationShip as List<IDTitleDTO>;