重写下拉列表的视图列(MVC3、实体框架)

本文关键字:实体 框架 MVC3 下拉列表 视图 重写 | 更新日期: 2023-09-27 17:57:01

当我使用从实体框架和设计器自动创建控制器/模型/视图时,我得到了一个非常干净的编辑表单。 1 对 1 关系之一创建一个下拉列表,该下拉列表向用户显示特定列中的值,但我希望它使用另一列/属性。

这是怎么做到的?

(仅供参考,我不是在 MVVM 中寻找一个类以及如何在视图模型中隔离它。 我没有带宽来学习和使用视图模型类重新创建此应用程序。

    <div class="editor-label">
        @Html.LabelFor(model => model.Domain, "Domain1")
    </div>
    <div class="editor-field">
        @Html.DropDownList("Domain", String.Empty))
        @Html.ValidationMessageFor(model => model.Domain)
    </div>

控制器:

    public ActionResult Edit(int id)
    {
        ClientJob clientjob = db.ClientJobs.Find(id);
        ViewBag.ClientId = new SelectList(db.Clients, "Id", "ClientName", clientjob.ClientId);
        ViewBag.CurrencyType = new SelectList(db.CurrencyTypes, "Id", "TypeName", clientjob.CurrencyType);
        ViewBag.Domain = new SelectList(db.Domains, "Id", "DomainName", clientjob.Domain);
        ViewBag.JobType = new SelectList(db.JobTypes, "Id", "JobTypeName", clientjob.JobType);
        ViewBag.DatabaseServer = new SelectList(db.Servers, "Id", "ServerName", clientjob.DatabaseServer);
        ViewBag.ProcessingServer = new SelectList(db.Servers, "Id", "ServerName", clientjob.ProcessingServer);
        ViewBag.QueryServer = new SelectList(db.Servers, "Id", "ServerName", clientjob.QueryServer);
        return View(clientjob);
    }

重写下拉列表的视图列(MVC3、实体框架)

如果我正确理解您的问题,您想传递要显示的项目列表而不是默认值?

我是这样做的:

<div class="editor-label">
    @Html.LabelFor(model => model.Domain, "Domain1")
</div>
<div class="editor-field">
    @Html.DropDownListfor(model => model.Domain, ViewData["DomainSelects"] as IEnumerable<SelectListItem>, "Select domain")
    @Html.ValidationMessageFor(model => model.Domain)
</div>

然后在控制器中,确保在视图数据中设置DomainSelects。选择列表项的值属性是应为"域"设置的值。因此,如果它是一个 FK,它将是一个 id。

我使用这样的代码(伪代码)

ViewData["DomainSelects"] = domains.Select(domain => new SelectListItem() { Value = SqlFunctions.StringConvert((double)domain.Id), Text = domain.Name});

刚刚创建的自动创建的代码选择列表:

ViewBag.Domain = new SelectList(db.Domains, "Id", "DomainName", clientjob.Domain);

我只需要更改选择列表中的列名:

ViewBag.Domain = new SelectList(db.Domains, "Id", "DomainType", clientjob.Domain);

在控制器中,准备整个列表

ViewBag.YourTypeCollection = context.YourTypes.ToList();

在视图中

@Html.DropDownListFor(m => m.Domain, 
     new SelectList((IEnumerable<YourType>)ViewBag.YourTypeCollection,
     "Id",
     "Name",
     Model.Domain==null?1:Model.Domain.Id))

Id 是类 id 字段,名称是要显示的字段。将这些值替换为适合您的模型的值。在我的示例中,如果模型的值为 null,则选择第一项。