【问题标题】:Dropdown list population from ViewModel来自 ViewModel 的下拉列表填充
【发布时间】:2023-03-19 11:30:02
【问题描述】:

首先,我知道这个问题已经被问过很多次了。我已经阅读了无数的文章和 Stack Overflow 的答案。我已经尝试了四天来解决这个问题,如果有人不介意,我想我需要帮助。

我有两个数据库。员工数据库有一个名为“DisplayName”的字段——第二个数据库与第一个数据库有关系,它们一起工作得很好。我可以在另一个应用程序中完美地调用这两个数据库。

你可以看到图片中的Index Page 我有一份人员名单。我想要一个下拉列表,列出数据库中的所有显示名称,以便员工可以将自己添加到列表中。您会在图像中看到一个下拉列表,但它没有被填充。

看起来很简单。但是,天哪。我遇到的部分问题是我的家庭控制器已经有一个功能来填充图片中的列表,所以我不能在那个页面上做另一个。我在很多网站上尝试了很多建议。我收到 IEnumerable 错误或显示引用错误....

这是我的控制器(同样 - 它没有任何帮助下拉菜单的内容):

namespace SeatingChart.Controllers
{
    public class HomeController : Controller
    {
        private ApplicationDbContext db = new ApplicationDbContext();


        // GET: Employee
        public ActionResult Index()
        {

            var lists = db.BreakModels
                            .Include("Employee")
                            .Include("TimeEntered")
                            .Include("TimeCleared")
                            .Include("DisplayName")
                            .Select(a => new HomeIndexViewModels
                            {
                                Employee = a.Employee,
                                DisplayName = a.EmployeeModels.DisplayName,
                                TimeEntered = a.TimeEntered,
                                TimeCleared = a.TimeCleared.Value,
                                Id = a.EmployeeModels.Id,
                            });

            return View(lists);
        }

查看:

    @model IEnumerable<SeatingChart.Models.HomeIndexViewModels>

@{
    Layout = null;
}

@Html.Partial("_Header")

    <div class="container_lists">
        <div class="container_break col-md-8">
            <h5 style="text-align:center">Break List</h5>
            <table class="table-bordered col-lg-12">
                @if (Model != null)
                {
                    foreach (var item in Model)
                    {
                        if (item.TimeCleared == null)
                        {
                            <tr>
                                <td>
                                    @Html.DisplayFor(modelItem => item.DisplayName)
                                </td>
                                <td>
                                    &ensp;BV
                                </td>
                                <td>
                                    &ensp;@item.TimeEntered.ToString("HH:mm")
                                </td>
                            </tr>
                        }
                    }
                }
            </table>
            @using (Html.BeginForm())
            {
                <div class="row site-spaced">
                    <div class="col-3">
                        @Html.DropDownList("DisplayName", new SelectList(new List<string>() { "---Dispatcher---" }), new { @class = "required " })
                    </div>
                </div>
                <div class="col-3">
                    <input type="submit" value="Submit" class="site-control" />
                </div>
            }
        </div>
    </div>

视图模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Html;

namespace SeatingChart.Models
{
        public class HomeIndexViewModels 
        {

        //Break Model
        public int BreakId { get; set; }
            public int Employee { get; set; }
            public DateTime TimeEntered { get; set; }
            public DateTime? TimeCleared { get; set; }

            //Employee Model
            public int Id { get; set; }
            public string DisplayName { get; set; }
            public string DisplayNames { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public bool NotActive { get; set; }
            public int Force { get; set; }

            public string EmployeeList { get; set; }


    }

}

我希望这已经足够清楚了。我用这么多代码尝试了这么多不同的方法——我尝试过的所有错误都是不同的。

提前感谢您的耐心和帮助!

【问题讨论】:

    标签: asp.net-mvc dropdown


    【解决方案1】:

    您可以添加到您的视图模型中

    public List<SelectListItem> Employees { get; set; }
    

    然后你可以用控制器填充这个列表,然后在视图中调用它:

    @Html.DropDownListFor(m => m.Id, Model.Employees, new { @class = "form-control", required = "required" })
    

    更新 - 如何填充列表。应该可以工作(但未经测试的代码)。

        public List<SelectListItem> GetEmployeeForDropdown(List<HomeIndexViewModels> list)
        {
            List<SelectListItem> empList = new List<SelectListItem>();
    
            try
            {
    
                    if (list != null && list.Count > 0)
                    {
                        foreach (var item in list)
                        {
                            empList.Add(new SelectListItem { Text = item.DisplayName, Value = item.Id.ToString() });
                        }
                    }
                    else
                    {
                        empList.Add(new SelectListItem { Text = "No items", Value = string.Empty });
                    }
    
    
            }
            catch (Exception ex)
            {
                //handle exceptions here
            }
    
            return empList;
        }
    

    编辑:记得在视图中使用你的模型!

    【讨论】:

    • 感谢您快速、耐心的回复。我是一个全新的婴儿程序员。我在我所拥有的索引控制器中添加了代码。 " List Employees = new List(); foreach (var user in db.EmployeeModels) { if (user.NotActive == false) {Employees.Add(new HomeIndexViewModels()); } }... . 但是我收到一个错误:不包含定义.... 对于 Model.Employees。你将如何填充 Employee 列表?我也做错了。
    • @TylerJohnson Searh 如何添加到列表
    • @JamesS 我已经搜索了这四天的各个方面。如果我没有花几天时间寻找答案,我不会仅仅为了听到“你为什么不寻找答案”而发布东西。我试图填充该列表。经过多个教程和数天的研究后,我所做和尝试的一切都以错误告终。我当然搜过了。我花了几天时间搜索和做教程。我的代码中有一些我没有看到的错误。我试图从那些能看到我不知道的人那里获得帮助。不过谢谢你的建议.....
    • @TylerJohnson 如果它不包含Model.Employees 的定义,则表示您尚未定义它。在类的构造函数中或在控制器方法中通过说model.Employees = new List&lt;//Whatever the class is&gt; 来定义列表。但是,通过查看控制器方法,您甚至还没有定义 model
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多