c# - ASP.NET 使用 MVC 将 linq 查询结果绑定(bind)到 HTML.DropDownList()

标签 c# asp.net asp.net-mvc razor

我正在尝试通过单个数据库调用构建下拉列表。

我的表由一个 Id 列和一个 CompanyName 列组成。我需要向用户显示 CompanyName 并在选择一个时将页面的 Id 设置为 Id。

我已经把一个简单的模型放在一起来存储信息:

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace Portal.Models
{
    public class CompanyListId
    {
        public int Id { get; set; }
        public string CompanyName { get; set; }
    }

    public class CompanyListIdDBContext : DbContext
    {
        public DbSet<CompanyListId> Contacts { get; set; }
    }
}

但是我在 View 中遇到 Controller 和 Razor 调用的问题。

我的 Controller :

public void CompanyListIdSearch()
        {
            using (var dc = new CompanyListIdDBContext())
            {
                var content = from p in db.Companies
                                select new { p.CoId, p.CompanyName };
            }
        }

View 中的 Razor 调用:

<div id="partners" class="linen">

                        @{Html.DropDownList("CompanyListIdSearch", new SelectList(Model.CompanyName));}
                    </div>

在 View 顶部抓取模型 @model Portal.Models.CompanyListId

因此,在较高的层次上,我想要做的是有一个 View ,该 View 使用 razor 标签调用 Controller , Controller 使用数据更新模型,然后该数据显示在下拉列表中。我是不是以错误的方式处理这个问题?

我收到这个错误:

The model item passed into the dictionary is of type 'Portal.Models.DashboardContents', but this dictionary requires a model item of type 'Portal.Models.CompanyListId'. 

最佳答案

不完全是。您不能像那样调用 DropDownList 中的方法。

首先,将该项目集合放入您的ViewBag:

using (var dc = new CompanyListIdDBContext())
{
    var content = from p in db.Companies
       select new { p.CoId, p.CompanyName };

    ViewBag.CompaniesList = content
        .Select(c => new SelectListItem
        {
            Text = c.CompanyName,
            Value = c.CoId.ToString()
        }).ToList();
}

确保在返回 View 之前在操作结果中调用该函数。

最后,只需使用您的模型属性并切换到 DropDownListFor:

@Html.DropDownListFor(m => m.Id, ViewBag.CompaniesList);

但是更好的方法是不使用 ViewBag 而是使用 View 模型。像这样:

public class CompanyViewModel
{
    public int Id { get; set; }
    public string CompanyName { get; set; }
    public List<SelectListItem> CompaniesList { get; set; }
}

那么你的操作方法应该是这样的:

public ActionResult YourAction()
{
    var model = new CompanyViewModel();

    using (var dc = new CompanyListIdDBContext())
    {
        var content = from p in db.Companies
            select new { p.CoId, p.CompanyName };

        model.CompaniesList = content
            .Select(c => new SelectListItem
            {
                Text = c.CompanyName,
                Value = c.CoId.ToString()
            }).ToList();
    }

    return View(model);
}

然后您的 View 将使用新模型:

@model CompanyViewModel

那么您的下拉菜单将是:

@Html.DropDownListFor(m => m.Id, Model.CompaniesList)

关于c# - ASP.NET 使用 MVC 将 linq 查询结果绑定(bind)到 HTML.DropDownList(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19140812/

相关文章:

c# - 我应该按什么顺序增加我的 ASP.NET 知识?

javascript - Kendo Window 不会触发服务器端按钮

c# - 将对象从一个 Aspx 从 Javascript 传递到另一个

c# - 在集合中找不到参数 '?user_email'

javascript - 无法弄清楚为什么我将 JavaScript 对象数组传递给 Controller ​​方法,但 Controller 方法没有获取该对象

asp.net-mvc - 从 MVC Razor 模型调用 Bootstrap 3 模态?

c# - 如何使用 Moq 使所有方法都可验证

c# - PRISM:如何将 View 模型添加到区域并自动创建 View ?

html - 为什么 td 文本颜色没有改变

asp.net-mvc - 处理 MVC 子操作中的错误