C#MVC DropDownListFor在可编辑记录表中

时间:2014-07-28 03:20:11

标签: c# asp.net-mvc asp.net-mvc-3 model-view-controller html.dropdownlistfor

我不确定这是否可行,并且没有发现任何类似的问题。

我们有一个编辑视图,不是针对单个记录,而是针对"父母的多个成员"记录。这些"孩子"记录需要一起编辑(同时)。 ......如果可能的话。

这些"孩子中的一个领域" records是对另一个表的引用,因此需要选择列表。我们在所有标准编辑视图中使用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个字段。直截了当,好吧..

我们设置DropDownListFor的代码是:

(编辑:在foreach()循环中添加的新代码,用于手动将每个列表中相关选项的.Selected属性设置为true。这仍然不会转换为实际显示的View ...)

    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代码适用于标准编辑视图中的单个记录。

渲染页面后,我们得到了多个&#34;孩子&#34;列出的记录,但DropDown列表不保存每条记录的现有值。 (这是一个EDIT而不是Create,因此已经通过默认值和其他逻辑分配了值 - 而不是通过Create View上的DropDown列表。

查看页面来源时,我可以看到每个DropDown列表都有自己的ID。

我觉得我们的问题是由于页面上有多个DropDownListFor对象,但无法弄清问题是什么以及我们为什么会遇到这个问题。

我们的View包含DropDownList的简单代码:

    @Html.DropDownListFor(model => model.members[i].MemberTypeLookUp_ID, Model.members[i].MemberTypeLookUp.list, "--Select--")
    @Html.ValidationMessageFor(model => model.members[i].MemberTypeLookUp_ID)

第三个参数已被添加,因为我们总是在DropDown列表中获得第一个选项,并且需要确定是否存在值。 我们不断得到&#34; - 选择 - &#34; DropDown列表中显示的选项,它是占位符而不是有效选项 - 因此会显示验证消息。

(编辑)我添加了完整的Edit View 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>
}

(结束编辑)

任何人都可以对我们的问题有所了解吗?提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

在阅读this answer on Stack Overflow之后,我们决定尝试相同的解决方案。

事实证明,完整的决议案如下:

  1. 我们仍然需要在设置代码中设置LookUpList(但不需要尝试任何选择代码):

    // other code above ...
    foreach (TeamEditViewItem tevi in this.members)
    {
        tevi.MemberTypeLookUp = new LookUpList("TeamMemberType");
    }
    
  2. LookUpList()代码根据原始问题/问题创建SelectList - 不需要进行任何更改。

  3. 我们还需要在编辑视图上替换DropDownListFor()调用:

    @Html.DropDownListFor(model => model.members[i].MemberTypeLookUp_ID, new SelectList(Model.members[i].MemberTypeLookUp.list, "Value", "Text", Model.members[i].MemberTypeLookUp_ID), "--Select--")
    
  4. 它似乎重复或多余,但这是必需的。我们可以采取一些措施来进一步清理它,但它没有打破&#34;现在,为什么要尝试解决它?

    我必须感谢@Stephen Muecke和@Mario Lopez的意见,让我们从我们正在做的事情中调查和思考更远的地方。另外,感谢@ataravati解决上面链接的其他问题,让我们尝试别的。

    希望我们的问题和解决方案可以帮助其他编码员......

答案 1 :(得分:0)

我认为正在发生的是所有的dropwdowns都是使用相同的Id = MemberTypeLookUp_ID生成的。我要做的是为子项创建局部视图,并从foreach内部的主视图中调用它,并仅将必须填充的子模型传递给此局部视图,而不是整个父模型。