Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将下拉列表选择保存回数据库_C#_Asp.net Mvc 4_Razor - Fatal编程技术网

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>