【问题标题】:Allowed values of attribute in drop down list C# ASP.NET MVC下拉列表中允许的属性值 C# ASP.NET MVC
【发布时间】:2020-07-31 16:25:55
【问题描述】:

我已经实现了状态的允许动态值:

public class EmployeeStatusAttribute : ValidationAttribute
{
    private string[] _allowedValues;

    public EmployeeStatusAttribute(string[] allowedValues)
    {
        _allowedValues = allowedValues;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var employee = value as Employee;
        if (_allowedValues.Contains(employee.Status))
        {
            return ValidationResult.Success;
        }
        return new ValidationResult(`{employee.Status} is not a valid status`);
    }
}
public class Employee
{
    [EmployeeStatus("Active", "Inactive")]
    public string Status { get; set; }
}

我需要访问这些允许的值(活动和非活动)。如何在视图中访问这些/如何将这些值从控制器传递到视图?

目前,我在视图中使用以下代码

<select class="form-control" asp-for="Status">
    <option>Active</option>
    <option>Inactive</option>
</select>

而不是硬编码这些值。我想动态访问这些。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core data-annotations


    【解决方案1】:

    在您的控制器操作方法中

    List<SelectListItem> li = new List<SelectListItem>();
    li.Add(new SelectListItem { Text = "Active", Value = "1" });
    li.Add(new SelectListItem { Text = "Inactive", Value = "0" });
    ViewBag.Status_ = li;
    

    在页面中

    <div class="col-md-10">
       @Html.DropDownList("Status", ViewBag.Status_ as List<SelectListItem>, new { @class = "form-control" })
       <div>
           @Html.ValidationMessageFor(m => m.Status, "", new { @class = "text-danger" })
       </div>
    </div>
    

    【讨论】:

    • 这又是一个静态解决方案。您正在向 li 添加硬编码值。相反,我想从 EmployeeStatus 数据注释中动态获取值。
    • 你可以从任何你想要的地方填充 li 列表。
    【解决方案2】:

    根据您的描述,我建议您可以尝试使用反射来获取属性值,然后构建一个列表选择项。然后你可以使用 asp-items 属性来创建意见。

    更多细节,您可以参考以下代码:

    型号:

    public class Employee
    {
        [EmployeeStatus("Active", "Inactive","test")]
        public string Status { get; set; }
    }
    

    控制器:

        public IActionResult Index()
        {
    
             //get the property custom attribute value
             var result = ((EmployeeStatusAttribute)(typeof(Employee).GetProperty("Status").GetCustomAttribute(typeof(EmployeeStatusAttribute))))._allowedValues;
    
            var ListSelectItem = new List<SelectListItem>();
             //create select list item
            foreach (var item in result)
            {
                ListSelectItem.Add(new SelectListItem() { Text=item,Value=item });
    
            }
            ViewData["List"] = ListSelectItem;
    
    
            var employeetest = new Employee() { Status="Test" };
    
            return View(employeetest);
        }
    

    查看:

    <select asp-for="Status" asp-items="@((List<SelectListItem>)ViewData["List"])">
     </select>
    

    结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多