【问题标题】:store a value from dropdown list to database MVC 5将下拉列表中的值存储到数据库 MVC 5
【发布时间】:2016-03-07 12:00:27
【问题描述】:

您好,在我的应用中,我有一个下拉列表

在我的控制器中我使用这个

public ActionResult Create()
    {

        webdata db = new webdata();
        ViewBag.annCategories = new SelectList(db.annCategories, "kind", "an_kindtext");
        return View();

    }

编辑 在我的 HttpPost 我有

    [HttpPost]
    [ValidateAntiForgeryToken]

    public ActionResult Create([Bind(Include = "ann_ID,Pubdate,kind,title")] announcements announcements)
    {
        if (ModelState.IsValid)
        {
            db.announcements.Add(announcements);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(announcements);
    }

在我看来我有这个

@Html.DropDownList("annCategories",null, new { id = "annCategories" })

我看到下拉列表中的值,当我单击创建按钮时,数据库中存储了一条新记录。但它总是保存“选择一个类别”,这是第一个选项。有人可以帮忙吗? 谢谢

编辑

我的公告模型

public class announcements
{
    [Key]
    [Display(Name = "ID")]
    public int ann_ID { get; set; }


    [Display(Name = "Date")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
    public DateTime Pubdate { get; set; }

    [Display(Name = "Category")]
    public int kind { get; set; }


    [Display(Name = "title")]
    public String title { get; set; }

    }

我的公告类别模型

public class annCategories
{

    [Key]
    [Display(Name = "Category")]
    public int kind { get; set; }


    [Display(Name = "Description")]
    public String an_kindtext { get; set; }

}

【问题讨论】:

  • 在分类表中是否有保存“选择分类”的数据库记录?如果是这样 id 想象这是非常有效的,因为如果未选择类别,DropDown 值将是“选择类别”选项的 ID
  • 是的,有一条带有“选择类别”的记录,但无论我选择什么,都会保存到所有记录中

标签: asp.net-mvc


【解决方案1】:

它没有保存"Select a category"。它正在保存模型的默认值,因为您从不将任何内容绑定到属性 kind,因此当您提交表单时,kind 的值是 0

首先创建一个view model 来表示您想要在视图中显示的内容

public class AnouncementVM
{
    public int? ID{ get; set; }
    [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}"] // see notes below
    public DateTime Date { get; set; }
    public int Category { get; set; }
    public string Title{ get; set; }
    public IEnumerable<SelectListItem> CategoryList { get; set; }
}

注意[DataType(DataType.Date)] 添加了type="date" 属性以呈现浏览器日期选择器(仅在 Chrome 和 Edge 中实现)所以除非你使用它,否则它可以被删除,但如果你正在使用它,那么你还必须使用[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)](即格式必须是yyyy-MM-dd

然后在GET方法中

public ActionResult Create()
{
    var model = new AnouncementVM
    {
        CategoryList = new SelectList(db.annCategories, "kind", "an_kindtext")
    };
    return View(model)
}

在视图中

@Html.DropDownListFor(m => m.Category, Model.CategoryList, "Please select")

在 POST 方法中

[HttpPost]
public ActionResult Create(AnouncementVM model)
{
    if (!ModelState.IsValid)
    {
        model.CategoryList = new SelectList(db.annCategories, "kind", "an_kindtext");
        return View(model);
    }
    announcements data = new announcements
    {
        Pubdate = model.Date,
        kind = model.Category,
        title = model.Title
    };
    db.announcements.Add(data);
    db.SaveChanges();
    return RedirectToAction("Index");
}

【讨论】:

  • 感谢您的回复,我收到错误消息:无法将类型 'System.Web.Mvc.SelectList' 隐式转换为 'System.Collections.Generic.IEnumerable'。存在显式转换(您是否缺少演员表?)我对其进行了搜索,但没有找到解决方案。错误出现在控制器的行:CategoryList = new SelectList(db.annCategories, "kind", "an_kindtext")
  • 那是因为你有错误的using 语句。它必须是System.Web.Mvc.SelectList(如果您在程序集中需要这两个 using 语句,那么您需要使用完全限定的程序集名称)。
  • 我添加了它,但它说:使用命名空间指令只能应用于命名空间; 'System.Web.Mvc.SelectList' 是类型而不是命名空间
  • 我不知道你做了什么,或者为什么你的模型中有using System.Web.WebPages.Html - 它应该被删除,但如果不能,那么你需要使用public IEnumerable&lt;System.Web.Mvc.SelectListItem&gt; CategoryList { get; set; }
  • 好的,我更正它。现在,如果我将您的代码添加到我的 HttpPsot 中,我会收到各种错误。你能在我的问题中看到我的编辑吗?非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多