MVC新手,从数据库中填充DropDownList

时间:2014-06-09 16:07:09

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

我正在尝试创建一个系统,在填写webform以向数据库添加条目的同时,从另一个可编辑数据库填充下拉列表。因此,管理员可以说,在工资单上的员工列表中添加另一个名称,然后在下次访问时将该名称填充到下拉列表中。

我尝试了很多其他问题的答案,比如我的SO,但我还没有能够得到任何工作。这是我认为最接近的人:MVC 4 Simple Populate DropDown from database model

使用它创建了一个“Pipeline”对象,(我正在处理的项目的名称):

[Table("Entries")]
public class pipeline
{
    [Key]
    public int entryID { get; set; }
    public salesStage currentSalesStage { get; set; }
    public string Name { get; set; }

}

“salesStage”对象,(这是我希望管理员能够更改的内容,因此理论上他们可以添加或删除销售阶段,员工会在他们创建新的“条目管道”时看到这些内容“):

[Table("salesStages")]
public class salesStage
{
    [Key]
    public int salesStageID { get; set; }
    [Display(Name = "Name")]
    public string Name { get; set; }
}

然后我有了ViewModel,该链接的答案概述了:

public class MyViewModel
{
    public pipeline Entry { get; set; }
    public IEnumerable<SelectListItem> salesStages { get; set; }
}

数据库上下文:

public class PipelineDB : DbContext
{
    public DbSet<pipeline> Entries { get; set; }
}

链接答案中概述的ActionResult:

public ActionResult Action(int id)
    {
        var model = new MyViewModel();
        using (var db = new PipelineDB())
        {
            model.salesStages = db.Entries.ToList().Select(x => new SelectListItem
                {
                    Value = x.currentSalesStage.ToString(),
                    Text = x.Name
                });
        }
        return View(model);
    }

最后我尝试将其集成到我的“创建”视图中:     @Model Pipeline9.Models.MyViewModel

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>


@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>pipeline</h4>
        <hr />
        @Html.ValidationSummary(true)

        <div class="form-group">
            @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Name)
                @Html.ValidationMessageFor(model => model.Name)
            </div>
        </div>
        <div class="form-group">
            @Html.LabelFor(model => model.currentSalesStage, new { @class = "control-label col-md-2"})
            <div class="col-md-10">
                @Html.DropDownListFor(x => model.currentSalesStage.salesStageID, Model.salesStages)
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

我认为创建视图是我出错的地方,因为它在@ Html.DropDownListFor上给了我一个错误。错误是:

  

CS1973:'System.Web.Mvc.HtmlHelper'没有名为'DropDownListFor'的适用方法,但似乎有一个名称的扩展方法。无法动态分派扩展方法。考虑转换动态参数或调用扩展方法而不使用扩展方法语法。

编辑:到目前为止,一切都已达到一定程度,但编译器一直告诉我“模型在当前上下文中不存在”     @ Html.DropDownListFor(x =&gt; model.currentSalesStage.salesStageID,...

4 个答案:

答案 0 :(得分:1)

也许试试这个?

<div class="col-md-10">
     @Html.DropDownListFor(x => model.currentSalesStage.salesStageID, (SelectList)Model.salesStages)
</div>

答案 1 :(得分:0)

当你这样做时: model.salesStages = db.Entries.ToList().Select(x => new SelectListItem { Value = x.currentSalesStage.ToString(), Text = x.Name });

您正在将model.salesStages设置为可枚举的表达式。如果您在选择后致电ToList(),则应将Select(...)枚举为List具体对象。

代码:

 model.salesStages = db.Entries.ToList().Select(x => new SelectListItem
            {
                Value = x.currentSalesStage.ToString(),
                Text = x.Name
            }).ToList();

答案 2 :(得分:0)

请改为尝试:

@Html.DropDownListFor(x => model.currentSalesStage.salesStageID, 
    new SelectList(Model.salesStages, "Value", "Text"))

修改

@ nwash57根据您最近的评论,您的currentSalesStage模型为null,因此为了解决它,将pipeline类的新实例分配到控制器中的此属性并将其传递给您的视图,例如。

public ActionResult Action(int id)
{
    var model = new MyViewModel();
    using (var db = new PipelineDB())
    {
        model.salesStages = db.Entries.ToList().Select(x => new SelectListItem
            {
                Value = x.currentSalesStage.ToString(),
                Text = x.Name
            });

        model = new pipeline();
    }
    return View(model);
}

这将解决您的问题。

答案 3 :(得分:0)

终于明白了。使用ViewBag填充下拉列表。

首先将您需要的数据库添加到控制器:

private MyDataBase db = new MyDataBase();

然后将ViewBag设置为控制器中的新SelectList:

ViewBag.MyViewBagVariable = new SelectList(db.MyDataBaseModels, "ID", "ID");

最后,在View下使用DropDownListFor帮助程序和ViewBag填充下拉列表:

@Html.DropDownListFor(model => model.MyDataBaseValue, (SelectList)ViewBag.MyViewBagVariable