C# Dropdownlist.Net核心实现模型的正确方法

C# Dropdownlist.Net核心实现模型的正确方法,c#,asp.net,asp.net-mvc,.net-core,dropdownlistfor,C#,Asp.net,Asp.net Mvc,.net Core,Dropdownlistfor,我目前正在尝试实现一个下拉列表,其中包含我认为是硬编码的值。基本上我想要的是有一个下拉列表,可以选择三个可能的值 我总共有4个控制器和视图将使用此下拉列表。我见过很多MVC2和MVC3的例子,人们在视图中硬编码了他们的下拉列表,我个人不喜欢像这样快速而“肮脏”的修复 我有一个包含以下内容的模型 public class Status { public int id { get; set; } public string status { get; set; } publ

我目前正在尝试实现一个下拉列表,其中包含我认为是硬编码的值。基本上我想要的是有一个下拉列表,可以选择三个可能的值

我总共有4个控制器和视图将使用此下拉列表。我见过很多MVC2和MVC3的例子,人们在视图中硬编码了他们的下拉列表,我个人不喜欢像这样快速而“肮脏”的修复

我有一个包含以下内容的模型

public class Status
{
    public int id { get; set; }
    public string status { get; set; }

    public Status(int statusId, string statusName)
    {
        id = statusId;
        status = statusName;
    }
}
状态应能有3个可能值中的任意一个:

Active
Inactive
Processing
我想使用我当前在status类中使用的方法创建status:

    public static List<Status> getAllStatus()
    {
        List<Status> states = new List<Status>();
        states.Add(new Status(1, "Active"));
        states.Add(new Status(2, "Inactive"));
        states.Add(new Status(3, "Processing"));
        return states;
    }
在my DB for my Customer模型中,我有一个字符串,我想在其中存储所选状态

因此,基本上我不想将以下内容更改为带有3个选项的下拉列表,
非活动
活动
处理


但是,我不想在我的视图中对其进行编码,因为我需要在8个不同的视图中对其进行复制粘贴,这不是一个非常流畅的代码。

您可以在类中将状态声明为公共属性,并使用此属性在视图中访问它:

  <ComboBox Grid.Column="1" Grid.Row="0"  Margin="5"
    VerticalAlignment="Center" ItemsSource="{Binding States}"     
    IsTabStop="False"}"/>

首先,你有很多模糊的问题。如果可以的话,请更具体一些。如果你不知道MVC是如何工作的,我建议你学习一些关于它的教程

Model.cs(首选ViewModel)。您应该创建一个传递到视图的ViewModel。下面是一个如何获取项目列表的示例

    public int SelectedStatusId { get; set; }

    [DisplayName("Status")]
    public IEnumerable<SelectListItem> StatusItems
    {
        get
        {
            yield return new SelectListItem { Value = "", Text = "- Select a status -" };
            StatusTypeEnum[] values = (StatusTypeEnum[])Enum.GetValues(typeof(StatusTypeEnum));

            foreach (StatusTypeEnum item in values)
            {
                if (item != StatusTypeEnum.Unknown)
                {
                    yield return new SelectListItem { Value = ((int)item).ToString(), Text = item.GetDescription() };
                }
            }

        }
    }
View.cshtml

 @Html.DropDownListFor(x => Model.SelectedStatusId, Model.StatusItems)
EnumAttribute.cs(阅读注释说明。不要试图理解这一点。这只是一个魔术。它通过反射获取枚举类型的DataAnnotation。)

公共静态类枚举属性
{        
公共静态字符串GetDescription(此TEnum值)
{
var fi=value.GetType().GetField(value.ToString());
如果(fi!=null)
{
var attributes=(DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute),false);
如果(attributes.Length>0)
{
返回属性[0]。说明;
}
}
返回值.ToString();
}
}

在数据库中将其保存为字符串没有多大意义,因为它听起来更像是静态的。所以你应该考虑一个枚举。对我来说,更准确地看一下我前面的答案,并将这些模型属性添加到ViewModel中

      public class CustomerViewModel () {
            public int SelectedStatusId { get; set; }

[DisplayName("Status")]
public IEnumerable<SelectListItem> StatusItems
{
    get
    {
        yield return new SelectListItem { Value = "", Text = "- Select a status -" };
        StatusTypeEnum[] values = (StatusTypeEnum[])Enum.GetValues(typeof(StatusTypeEnum));

        foreach (StatusTypeEnum item in values)
        {
            if (item != StatusTypeEnum.Unknown)
            {
                yield return new SelectListItem { Value = ((int)item).ToString(), Text = item.GetDescription() };
            }
        }
    }
}


}
你就完了。如果您更多地使用需要建立的列表,请将其添加到viewModel对象中

您好


S..

是否可以选择使用枚举而不是包含id+名称的类?在这种情况下,您可以使用EnumDropDownlist来完成这项工作,但我不知道如何处理这两项工作。我知道如何创建枚举,但问题是我将在数据库中以字符串形式存储所选值。这与控制器有关,而与视图无关。你需要把它当作绳子吗?使用.ToString()将ViewModel属性传递给Model属性(或属性,如果它不是有效的标识符…)我想我忘了提到我将在数据库中以字符串形式存储所选值,并且我使用的视图没有我的status类的模型,而是我将要存储在数据库中的对象模型。我认为我们不能没有类状态,因为选项来自数据库。它不是。我希望这些值是“硬编码”的,而不是保存在数据库中,但我希望将所选选项作为字符串存储在我正在保存的对象的数据库中。
@Html.DropDownListFor(m=>m.status_id,new List{new SelectListItem{Text=“1”,Value=“Active”,Selected=true},new-SelectListItem{Text=“2”,Value=“InActive”},new-SelectListItem{Text=“3”,Value=“Processing”})
试试这个,但不要使用数据库。这基本上是在视图中硬编码,我在问题中解释的视图不是我想要的。我将需要这段代码在总共8个视图中,只是/复制粘贴它在所有视图中都是糟糕的程序设计。谢谢:)你是如何格式化它的,所以代码将出现?这个问题是关于ASP.NET MVC,而不是WPF。请参见问题下方的标签。:)我试图在我的问题上更具体一些。请阅读我的编辑:P
  public enum StatusTypeEnum()
  {
      [Description("Active")] // For correct naming
      Active,
      Inactive,
      Processing
  }
 @Html.DropDownListFor(x => Model.SelectedStatusId, Model.StatusItems)
  public static class EnumAttribute
  {        
    public static string GetDescription<TEnum>(this TEnum value)
    {
        var fi = value.GetType().GetField(value.ToString());

        if (fi != null)
        {
            var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

            if (attributes.Length > 0)
            {
                return attributes[0].Description;
            }
        }

        return value.ToString();
    }
}
      public class CustomerViewModel () {
            public int SelectedStatusId { get; set; }

[DisplayName("Status")]
public IEnumerable<SelectListItem> StatusItems
{
    get
    {
        yield return new SelectListItem { Value = "", Text = "- Select a status -" };
        StatusTypeEnum[] values = (StatusTypeEnum[])Enum.GetValues(typeof(StatusTypeEnum));

        foreach (StatusTypeEnum item in values)
        {
            if (item != StatusTypeEnum.Unknown)
            {
                yield return new SelectListItem { Value = ((int)item).ToString(), Text = item.GetDescription() };
            }
        }
    }
}


}
   public class CustomerCOntroller(){
         public ActionResult Index(){
              CustomerViewModel viewModel = new CustomerViewModel();
              return View(viewModel);
         }       
  }