C# 如何将下拉列表选择保存回数据库
我的下拉列表正在拉取并显示正确的列表,但是一旦选中,我单击“保存”,所选选项将被忽略,并且该值再次为空 //得到 //职位C# 如何将下拉列表选择保存回数据库,c#,asp.net-mvc-4,razor,C#,Asp.net Mvc 4,Razor,我的下拉列表正在拉取并显示正确的列表,但是一旦选中,我单击“保存”,所选选项将被忽略,并且该值再次为空 //得到 //职位 [HttpPost] public ActionResult Edit(Prospect prospect) { if (ModelState.IsValid) { db.Entry(prospect).State = EntityState.Modified; db.S
[HttpPost]
public ActionResult Edit(Prospect prospect)
{
if (ModelState.IsValid)
{
db.Entry(prospect).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.ProductID = new SelectList(db.Products, "ProductID", "Name", prospect.Product);
return View(prospect);
}
//看法
<div class="editor-label">
@Html.LabelFor(model => model.Product)
</div>
<div class="editor-field">
@Html.DropDownList("ProductId", String.Empty)
@Html.ValidationMessageFor(model => model.Product)
</div>
@LabelFor(model=>model.Product)
@DropDownList(“ProductId”,String.Empty)
@Html.ValidationMessageFor(model=>model.Product)
任何帮助都将非常感谢仅当帮助者(显示器除外)与模型绑定时。将下拉列表更改为
@Html.DropDownListFor(x => x.ProductID, (SelectList)ViewBag.ProductID)
其中ProductID是模型中希望所选项目绑定到的任何值。通过在将下拉列表传递给视图之前设置该值,也可以通过这种方式设置下拉列表
更新:
我同意松饼人的回答。使用ViewBag向视图发送下拉列表可能不可靠。用另一种方式来解释松饼人提供的答案
将列表添加到模型中
public List<SelectListItem> Products { get; set; }
仅适用于辅助对象(显示除外)绑定到模型。将下拉列表更改为
@Html.DropDownListFor(x => x.ProductID, (SelectList)ViewBag.ProductID)
其中ProductID是模型中希望所选项目绑定到的任何值。通过在将下拉列表传递给视图之前设置该值,也可以通过这种方式设置下拉列表
更新:
我同意松饼人的回答。使用ViewBag向视图发送下拉列表可能不可靠。用另一种方式来解释松饼人提供的答案
将列表添加到模型中
public List<SelectListItem> Products { get; set; }
您不应该将视图直接绑定到数据库表类型。使用视图模型。此外,此类数据属于视图模型,而不是viewbag。视图包非常适合在视图和布局页面之间共享页面标题等内容
public class ProspectViewModel
{
public IEnumerable<SelectListItem> ProspectList { get; set; }
[DisplayName("Product")] //This is for our label
public int SelectedProspectId { get; set; }
}
职位
看法
@LabelFor(model=>model.SelectedProductId)
@Html.DropDownListFor(x=>x.SelectedProductId,Model.ProductList)
@Html.ValidationMessageFor(x=>x.SelectedProductId)
这超出了本答案的范围,但您不应该在控制器内进行数据访问。Microsoft的示例说明了这一点,因为它们是“Hello world”示例,不一定是字面意思。您不应该将视图直接绑定到数据库表类型。使用视图模型。此外,此类数据属于视图模型,而不是viewbag。视图包非常适合在视图和布局页面之间共享页面标题等内容
public class ProspectViewModel
{
public IEnumerable<SelectListItem> ProspectList { get; set; }
[DisplayName("Product")] //This is for our label
public int SelectedProspectId { get; set; }
}
职位
看法
@LabelFor(model=>model.SelectedProductId)
@Html.DropDownListFor(x=>x.SelectedProductId,Model.ProductList)
@Html.ValidationMessageFor(x=>x.SelectedProductId)
这超出了本答案的范围,但您不应该在控制器内进行数据访问。微软的例子说明了这一点,因为它们是“Hello world”的例子,不一定是字面意思。你能说明你的
潜在客户是什么吗
?你能说明你的潜在客户是什么吗
?太棒了,谢谢你抽出时间,也谢谢你的其他贡献者,最初,我在dropdownlist中错过了“For”之后出现了一个错误,并转到了Muffin Man's,然而,一分钟后我彻底迷路了,谢天谢地,我看到了额外的“For”。再次感谢大家,祝你们有一个美好的一天。这个答案太草率了。没有关于您提供的总体解决方案的指导。如果Matt想更新他的答案,为您提供最佳实践建议,我很乐意取消否决票。@Muffindman我不确定使用他现有的设置并解决其问题的答案是如何草率的。我完全同意你如何设置你的答案(我是对你答案的投票)。根据要求,我提供了一个更好的解决方法的建议,也许草率有点极端,是的,你确实回答了他的问题,我认为这是可行的,但是我认为如果你要提供直接的答案,你应该说这会解决你的问题,但这不是正确的方式,也不是正确的方式。我可以从他提供的代码中看出,他对所有这些都缺乏了解,确实需要一些帮助。因此,既然如此,我将取消对你的否决票和赞成票。@Muffinman完全同意你的意见,先生。谢谢你的建议和投票:)太棒了,谢谢你的时间,也谢谢你的其他贡献者,我最初在dropdownlist中错过了“for”后出错,转到了Muffin Man,但一分钟后我彻底迷路了,感谢你看到了额外的“for”。再次感谢大家,祝你们有一个美好的一天。这个答案太草率了。没有关于您提供的总体解决方案的指导。如果Matt想更新他的答案,为您提供最佳实践建议,我很乐意取消否决票。@Muffindman我不确定使用他现有的设置并解决其问题的答案是如何草率的。我完全同意你如何设置你的答案(我是对你答案的投票)。根据要求,我提供了一个更好的解决方法的建议,也许草率有点极端,是的,你确实回答了他的问题,我认为这是可行的,但是我认为如果你要提供直接的答案,你应该说这会解决你的问题,但这不是正确的方式,也不是正确的方式。我可以从他提供的代码中看出,他对所有这些都缺乏了解,确实需要一些帮助。因此,既然如此,我将取消对你的否决票和赞成票。@Muffinman完全同意你的意见,先生。谢谢你的建议和投票:)
public ActionResult Edit(int id)
{
var prospect = db.Prospects.Find(id);
if (prospect == null)
{
return HttpNotFound();
}
var model = new ProspectViewModel
{
ProductList = db.Products.Select(x=> new SelectListItem { ... })
};
return View(model);
}
[HttpPost]
public ActionResult Edit(ProspectViewModel model)
{
if (ModelState.IsValid)
{
var prospect = new Prospect { /* populate with values from model */ };
db.Prospects.Attach(prospect);
db.Entry(prospect).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
//Need to repopulate drop down list
//And we don't need to set SelectedProductId because it's already been posted back
model.ProductList = db.Products.Select(x=> new SelectListItem { ... });
return View(model);
}
<div class="editor-label">
@Html.LabelFor(model => model.SelectedProductId)
</div>
<div class="editor-field">
@Html.DropDownListFor(x=> x.SelectedProductId, Model.ProductList)
@Html.ValidationMessageFor(x=> x.SelectedProductId)
</div>