我正在尝试创建一个系统,在填写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,...
答案 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