【问题标题】:DropDownList Initial Value Duplicated - MVC 5DropDownList 初始值重复 - MVC 5
【发布时间】:2019-07-15 15:50:08
【问题描述】:

我的视图中有一个@foreach,它可以制作一张桌子。每行有两个项目,它是td。当我单击“编辑”按钮时,一行中的可见项消失(DislayFor's),而行中的隐藏项出现(DropDownList

查看代码

        <td class="col-md-3">
            <span class="item-display">
                <span style="font-size: 17px">
                    @Html.DisplayFor(modelItem => item.Movie.Name)
                </span>
            </span>
            <span class="item-field">
                @Html.DropDownList("movieID", item.Movie.Name)
            </span>
        </td>

通过这样做,我可以在 DropDownList 中选择一个新值,然后将该更改保存到我的数据库中(然后隐藏 DropDownList 并取消隐藏 DisplayFor。

一切正常,但是我对最初选择的值有疑问,它出现了两次,初始值的实际 value 为 0(与数据库中的任何内容无关)。

图片示例

问题:

现在我的下拉列表添加点击编辑时的值,最初选择的项目具有正确的名称,但它的索引为 0(这对我的数据库无效)。

我希望不添加最初选择的项目,而是将下拉列表的选择器设置为相应项目的正确索引。我不确定为什么它会重复我选择的项目两次。

控制器代码

public ActionResult Index(string Filter, string searchString)
{

    if (String.IsNullOrEmpty(searchString) || String.IsNullOrEmpty(Filter) || (Int32.Parse(Filter) == 0))
    {
        ViewBag.employeeID = new SelectList(db.Employees, "ID", "Name", );
        ViewBag.movieID = new SelectList(db.Movies, "ID", "Name", initiallySelectedValue);
        ViewBag.roleID = new SelectList(db.Roles, "ID", "RoleType");
        var movieemployees = db.MovieEmployees.Include(m => m.Employee).Include(m => m.Movie).Include(m => m.Role);
        return View(movieemployees.ToList().OrderBy(x => x.Employee.Name));
    }
    else
    {
        ViewBag.employeeID = new SelectList(db.Employees, "ID", "Name");
        ViewBag.movieID = new SelectList(db.Movies, "ID", "Name");
        ViewBag.roleID = new SelectList(db.Roles, "ID", "RoleType");



        var parameter = Int32.Parse(Filter);
        return View(db.MovieEmployees.Include(m => m.Employee).Include(m => m.Movie).Include(m => m.Role).Where(x => (parameter == 1 && x.Movie.Name.Contains(searchString)) || (parameter == 2 && x.Employee.Name.Contains(searchString)) || (parameter == 3 && x.Role.RoleType.Contains(searchString))).Distinct().ToList().OrderBy(x => x.Employee.Name));
    }

}

【问题讨论】:

  • 我已将您的问题读了三遍,但仍然不清楚您在问什么(至少对我而言)。我看到您正在使用 DropDownList 并且似乎只是将单个字符串传递给该方法。您如何获得问题中所示的所有其他选项?
  • @JustinHelgerson 我是 MVC 新手,但我“认为”这里的这条线 "movieID", item.Movie.Name 是说要从 movieID 中的我的 Model 中取出所有项目并放置它们在那里并从item.Movie.Name 获取适当的字符串名称。 (db.Movie.Name)

标签: drop-down-menu asp.net-mvc-5


【解决方案1】:

您对DropDownList 参数的理解并不完全正确,但您已经接近了! DropDownList(在您的情况下为 item.Movie.Name)的第二个参数是添加 option 标签。如果您将其替换为硬编码字符串,该字符串可以作为其工作的一个很好的示例(您会将该字符串视为每个选择输入的第一个选项)。

听起来你想删除最后一个参数,因为它最终只会作为重复项。您的代码将如下所示:

@Html.DropDownList("movieID")

代码的重要部分是您使用密钥movieID 构建存储在ViewData 中的对象的位置。你没有发布你的控制器代码,但我想它看起来像:

var movies = movieRepository.GetAllMovies();
ViewData["movieID"] = new SelectList(movies, "Name", "Id", initiallySelectedValue);

其中NameId 是电影对象的属性名称,initiallySelectedValue 是不言自明的。

编辑

以下是我将如何解决您的问题的示例:

控制器

public ActionResult Index() {
    //Get all the possible movies that can be selected
    var movies = movieRepository.GetAllMovies();
    //Get a list of employees with their related favorite movie record
    var employeesWithFavoriteMovie = movieRepository.GetEmployeesWithMovie();

    var employeeModels = new List<EmployeeModel>();

    //Iterate through the list of employees and their favorite movie, and build the model
    foreach (var employeeWithFavoriteMovie in employeesWithFavoriteMovie) {
        employeeModels.Add(new EmployeeModel() {
            FirstName = employeeWithFavoriteMovie.FirstName,
            FavoriteMovieId = employeeWithFavoriteMovie.Movie.Id,
            MovieSelectList = new SelectList(movies, "Name", "Id", employeeWithFavoriteMovie.Movie.Id)
        });
    }

    return View(employeeModels);
}

查看

@model IEnumerable<WebApplication1.Controllers.EmployeeModel>

@foreach (var employeeModel in Model) {
    @Html.DropDownList("Test", employeeModel.MovieSelectList)
}

注意SelectList 是如何为每个员工构建的,然后每个列表都填充了员工当前最喜欢的电影 ID。现在,这将使您能够为每位员工正确构建 SelectList

【讨论】:

  • 啊,这更有意义!但是,我对如何执行initiallySelectedValue 仍然有些模糊。现在正如预期的那样,当我单击编辑时,它会显示下拉菜单,其中所选值作为每个字段的第一个值,而我希望下拉菜单保留它所在的当前索引。
  • 如果有帮助,我还添加了控制器的 Index() 代码!
  • @Austin 仅将所选值用作第一个字段,因为您要向选择列表中添加一个默认选项,该选项恰好是电影名称。例如,将item.Movie.Name 更改为"AustinTheStormtrooper"。您将开始看到第二个参数实际上在做什么。它没有设置选定的值,而是添加了一个默认选项。如果您想正确执行此操作,您实际上需要为每个员工 构建一个SelectList。这样每个选择列表都会知道他们当前选择的最喜欢的电影是什么。如果需要,我可以提供一些代码来提供帮助。
  • 我已经按照您在答案中的建议删除了 optionLabel 。通过这样做,它现在将初始值设置为每个列表的第一个值。我现在要做的是以某种方式将初始值设置为之前的值。因此,如果名称是 Commander Rex,并且我想编辑它,我希望下拉列表具有 Commander Rex 的索引值,现在它只显示列表的第一个值。有道理?我也在问题中添加了我的选择列表 ^
  • 我基本上是按照你所说的去做,ViewBag.employeeID = new SelectList(db.Employees, "ID", "Name", "employeeID");,但我不知道如何格式化它来为每个员工设置 selectedValue。
【解决方案2】:
@Html.DropDownListFor(model => model.classmasterd_HCF[i].TD_TEACHER, new SelectList(Model.Teacher, "ParamKey", "ParamValue", Model.classmasterd_HCF[i].TD_TEACHER) as SelectList, new { @class = "form-control input-sm DtlField EditableCtrl", @style = "min-width:100%;", @disabled = "disabled" })

Model.Teacher 中的 Teacher 是一个模型,代码在 paramKey 中,描述在 paramvalue 中。所选值保存在TD_TEACHER 字段中

【讨论】:

    猜你喜欢
    • 2013-12-19
    • 2021-03-10
    • 2016-08-09
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多