【问题标题】:ASP.NET Binding linq query results to HTML.DropDownList() using MVCASP.NET 使用 MVC 将 linq 查询结果绑定到 HTML.DropDownList()
【发布时间】:2013-10-03 03:49:54
【问题描述】:

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

我的表由一个 Id 列和一个 CompanyName 列组成。 I need to display the CompanyName to the user and when one is selected set the Id for the page to 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; }
    }
}

但是我在视图中遇到了控制器和剃刀调用的问题。

我的控制器:

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

视图中的剃刀调用:

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

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

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

所以在高层次上,我想要做的是有一个视图,它用剃刀标签调用控制器,控制器用数据更新模型,然后该数据显示在下拉列表中。我是不是走错了路?

我收到此错误:

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'. 

【问题讨论】:

  • Viewbag 有效。使用 ViewModels 是另一种选择。 View Models

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


【解决方案1】:

不完全是。你不能像那样调用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();
}

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

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

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

然而,更好的方法是不使用ViewBag,而是使用视图模型。像这样的:

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);
}

那么您的视图将使用新模型:

@model CompanyViewModel

那么您的下拉菜单将是:

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

【讨论】:

  • ViewModel 与常规模型有根本不同吗?我可以重复使用上面的内容吗?还是 ViewModel 的功能允许我将模型数据推送到专门用于视图的单独对象?
  • @ZachM。它基本上是为显示/编辑目的而创建的模型的表示。这意味着您不必将模型类也暴露给视图(尤其是当它们用作 EF/ORM 类时)。
  • 我遇到的一个问题是 coid 是一个整数,而选择列表项不喜欢这样。
  • 感谢您的帮助,但我无法执行您的建议。我认为它回到了绘图板上。
  • @Zach 啊我的印象是你没有加载任何东西。您可以更改它,以便操作方法采用id,然后通过id 检索该公司,然后将model.CompanyIdmodel.CompanyName 设置为该公司的那些
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
相关资源
最近更新 更多