C# Dropdownlist asp.net

C# Dropdownlist asp.net,c#,asp.net,asp.net-mvc,drop-down-menu,C#,Asp.net,Asp.net Mvc,Drop Down Menu,我有一个允许用户创建新项目的应用程序。现在,用户需要填写标题、正文和类别 该类别是一个文本框,但我想将其转换为dropdownlist。所有这些都连接到数据库,当用户提交时,数据应保存在数据库中。现在一切正常,我只是在实现dropdownlist时遇到了问题 我的型号: public class NewsItem { public int ID { get; set; } [Required(ErrorMessage = "Title is Requir

我有一个允许用户创建新项目的应用程序。现在,用户需要填写标题、正文和类别

该类别是一个文本框,但我想将其转换为dropdownlist。所有这些都连接到数据库,当用户提交时,数据应保存在数据库中。现在一切正常,我只是在实现dropdownlist时遇到了问题

我的型号:

 public class NewsItem
    {
        public int ID { get; set; }
        [Required(ErrorMessage = "Title is Required")] 
        public string Title { get; set; }
         [Required(ErrorMessage = "Body is Required")] 
        public DateTime DateCreate { get; set; }
        public string Category { get; set; }
    }
实现这一点最快/最好的方法是什么。我应该在模型中这样做,还是可以指定视图中可用的值


提前谢谢

首先,一些语义。由于实体框架与MVC一起出现,因此假设您的POCO是“模型”。(不幸的是,微软把搭建好的POCO放在了“模型”文件夹中,这是一种累赘)。然而,就模型视图控制器中的“模型”而言,这些不是模型;相反,它们只是“实体”,这是一种花哨的说法,“几乎只是一个DTO EF可以用来将数据库中的数据填充到其中。”

我要指出的是:不,你不应该把你的下拉列表选择放在你的实体上。但是,你也不应该依赖于视图。这里真正需要的是视图模型。创建一个类,该类只包含需要编辑的字段和视图所需的任何其他业务逻辑(例如类别的选择),然后将实体映射到此视图模型,并从中映射实体。例如:

public class NewsItemViewModel
{
    [Required(ErrorMessage = "Title is Required")] 
    public string Title { get; set; }

    [Required(ErrorMessage = "Body is Required")] 
    public DateTime DateCreate { get; set; }

    public string Category { get; set; }

    public IEnumerable<SelectListItem> CategoryChoices { get; set; }
}
基本上,您只是更新视图模型,以便将其提供给视图。不过,在实际返回之前,您需要填写您的类别选择。我假设它们也是实体,但您可以使用任何需要的方法在这里获取它们,否则

对于您的后期操作:

[HttpPost]
public ActionResult CreateNewsItem(NewsItemViewModel model)
{
    if (ModelState.IsValid)
    {
        // map view model to entity
        var newsItem = new NewsItem
        {
            Title = model.Title,
            Category = model.Category,
            // and so on
        }

        db.NewsItems.Add(newsItem);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    model.CategoryChoices = db.Categories.Select(m => new SelectListItem { Value = m.Name, Text = m.Name });
    return View(model);
}
我只是在这里做一个从视图模型到新新闻项的手动映射,但是对于真实场景,您可能希望为此集成一个映射库,例如AutoMapper。另外,请注意,如果出现错误,必须在再次返回视图之前重新填充类别选项。您的表单不会发布这些内容,因此传入的模型将不会包含这些内容

最后,你认为:

@model Namespace.To.NewsItemViewModel

...

@Html.DropDownListFor(m => m.Category, Model.CategoryChoices)

谢谢你的详细回答:),非常有启发性。。我有一个关于“定义”类别选择的问题。我还没有使用过IEnumerable list,因为我是c#asp.net的新手。假设我想要3类鸡蛋、面包和黄油。我可以在视图中使用categorychoices.add(“面包”)、categorieschoices.add(黄油)等,然后按照您的建议在控制器中返回每个类别吗?
IEnumerable
只是允许枚举(循环)的类型的接口通过他们的数据集。
List
实现了
IEnumerable
以及
IList
和其他接口。如果你不熟悉接口,那就这样做吧,它们是使用C#的核心部分。Pluralsight有一些很棒的课程,或者只是看看谷歌搜索会出现什么。
@model Namespace.To.NewsItemViewModel

...

@Html.DropDownListFor(m => m.Category, Model.CategoryChoices)