为视图创建或数据库存储定义选择/下拉选项的最佳实践方法是什么

Chr*_*rry 6 c# asp.net-mvc enums drop-down-menu

我还不确定最佳方式来存储前端显示或数据库存储的选择列表选项.

我一直在使用Enums,也使用描述装饰器(如何从ASP.NET MVC中的枚举创建一个下拉列表?)

我现在想我也可以为这些东西创建一个完整的类,所以我可以完全控制地存储以下信息:

  1. 项目名称
  2. 详细描述
  3. int用于存储在db中
  4. 订购
  5. 任何从列表中获取信息的方法.

是不是我应该考虑用手自己实现这一切?我想要一个非常可靠的方法来做到这一点,并且一个enum并不真的觉得它会削减它.

Kur*_*ler 5

我应该考虑自己手动实现所有这些吗?

是的。枚举通常是有漏洞且不充分的抽象,并不总是适合您实际希望表示的复杂域模型。

与其自己动手,不如考虑Headspring的 Enumeration 类(通过githubnuget)。我们一直使用它而不是枚举,因为它几乎一样简单,而且更加灵活。

“State”枚举并将其用作选择列表的示例:

public class State : Enumeration<State>
{
    public static State Alabama = new State(1, "AL", "Alabama");
    public static State Alaska = new State(2, "AK", "Alaska");
    // .. many more
    public static State Wyoming = new State(3, "WY", "Wyoming");

    public State(int value, string displayName, string description) : base(value, displayName)
    {
        Description = description;
    }

    public string Description { get; private set; }
}

public IEnumerable<SelectListItem> Creating_a_select_list(State selected)
{
    return State.GetAll().Select(
        x => new SelectListItem
        {
            Selected = x == selected,
            Text = x.Description,
            Value = x.Value.ToString()
        });
}
Run Code Online (Sandbox Code Playgroud)

我并不是要向您推销这个特定的实现,您当然可以自己编写代码(Enumeration 类只有大约 100 行代码)。但我绝对认为你会从超越基本枚举中受益。鉴于您在问题中描述的场景,这是正确的方法。


小智 1

您可以使用“存储库模式”进行数据访问,并在控制器和视图之间使用视图模型。例子:

//Model
public class CustomerViewModel
{
    public Customer customer { get;set; }        
    public IEnumerable<Village> Villages { get; set; }
}

//Controller
public ActionResult Index()
{
    var customerViewModel = new CustomerViewModel
                           {
                               Customer = new Customer(),
                               Villages = _villageService.GetAll()
                           };
    return View(customerViewModel);
}

//View
@model ViewModel.RegisterViewModel
@Html.DropDownListFor(q => q.Customer.VillageId, new SelectList(Model.Villages, "Id", "Title"), "Please Select")
Run Code Online (Sandbox Code Playgroud)

我写了一篇关于存储库模式的博文,你可以看看。