【问题标题】:Html helpers for enum in Asp .Net MVCAsp .Net MVC 中枚举的 Html 助手
【发布时间】:2021-04-22 01:13:55
【问题描述】:

我有两个模型类:

  1. Employee.cs
    public class Employee
    {
        public int Id { get; set; } 
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public ProjectType Project { get; set; }
    }
  1. ProjectType.cs

    public enum ProjectType
    {
        Project1,
        Project2,
        Project3,
        Project4
    }

EmployeeCreate 视图中,我想显示可以检查其中几个项目的项目。

我在创建视图中使用Html.RadioButtonFor 创建了一个foreach 循环

@model App.Data.Models.Employee
@using App.Data.Models;
    
@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
}

<div class="form-horizontal">

<div class="form-group">
   @Html.LabelFor(model => model.Project, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @foreach (var project in Enum.GetValues(typeof(ProjectType)))
        {
        <div class="col-md-10">

            @Html.RadioButtonFor(m => m.Project, project)
            @Html.Label(project.ToString())
        </div>
                }
        </div>

        </div>

    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>



如果我能够选择多个选项,这会很好。我假设在这种情况下,我应该使用 Html.CheckBoxFor 创建 foreach 循环,并且我试图像在此指令中那样执行此操作 -> http://findnerd.com/list/view/How-to-bind-checkbox-with-enum-values-in-MVC/25707/

但它并没有真正起作用: 我没有向 ProjectType.cs 添加任何内容。我在 Employee.cs 中添加了一个类

 public class Employee
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public List<EnumModel> CheckBoxProjectType { get; set; }
    }
    public class EnumModel
    {
        public ProjectType ProjectType { get; set; }
        public bool isSelected { get; set; }
    }

当我在 EmployeeController 中创建循环时 - CheckBoxProjectType 带有红色下划线:

  public ActionResult Create()
        {
            ProjectType model = new ProjectType();
            model.CheckBoxProjectType = new List<EnumModel>();
            foreach (ProjectType projectType in Enum.GetValues(typeof(ProjectType)))
            {
                model.CheckBoxProjectType.Add(new EnumModel() { ProjectType = projectType, isSelected = false });
            }
            return View();
        }

在创建视图中,我试图从我之前发布的链接中复制循环

@model App.Data.Models.Employee
@using App.Data.Models;
    
@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
}

<div class="form-horizontal">
    
       <div class="form-group">
      
            <div class="col-md-10">
                @for (int i = 0; i < Model.CheckBoxProjectType.Count; i++)
                {
                    @Html.DisplayFor(m => m.CheckBoxProjectType[i].ProjectType);
                    @Html.CheckBoxFor(m => m.CheckBoxProjectType[i].isSelected);
                    @Html.HiddenFor(m => m.CheckBoxProjectType[i].ProjectType);
                }


                @Html.ValidationMessageFor(model => model.ProjectType, "", new { @class = "text-danger" })

        

            </div>

        </div>

    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>


有人可以指导我如何为枚举创建 foreach 循环吗?

【问题讨论】:

  • 如果您想获得帮助,能否出示您的复选框代码?
  • 我很困惑你的问题是什么。你能在这里查看你的帖子并澄清一下吗?您要选择多个还是不选择?你有什么错误?
  • 请您也展示一下您的模型类吗?
  • 我已经用我的复选框代码更新了我的帖子,但它不起作用。
  • 我希望能够选择几个项目。当我创建新员工时,我想选择分配给他的项目,这样我就可以在员工视图中显示有关特定项目的信息。

标签: c# asp.net-mvc foreach html-helper


【解决方案1】:

我已经看到了错误——“i”没有定义也没有分配。你怎么能编译这个?

 @Html.LabelFor(m => m.CheckBoxProjectType[i].ProjectType);

用户只是“项目”。

而且我在您的创建视图和操作中也没有看到任何@model。

public ActionResult Create()
        {
            ProjectType model = new ProjectType();
              //Where is your ProjectType class?
             // and why I see an Employee AS a model in your view?
......
           
       //you have to change your return to this

            return View(model);
        }

最好创建一个像这样的特殊视图模型用作模型(将其放在单独的文件中):

public class EmployeeViewModel
{
        public Employee Employee{ get; set; }
        public List<EnumModel> EnumModels{ get; set; }
 }

您的员工将是:

public class Employee
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public List<ProjectType > ProjectTypes { get; set; }
    }

您的新创建操作将如下所示:

public ActionResult Create()
        {
            var model = new EmployeeViewModel{
                Employee=new Employee, 
                EnumModels=new List<EnumModel>()
               };
           
            foreach (var projectType in Enum.GetValues(typeof(ProjectType)))
            {
                model.EnumModels.Add(new EnumModel { ProjectType = projectType, 
                isSelected = false });
            }
            return View(model);
        }

并在您的创建视图中用 EmployeeModel 替换 Employee(我认为您也必须添加一些 Employee 输入控件):


@using App.Data.Models
@model EmployeeViewModel
    
@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
}

<div class="form-horizontal">
    
       <div class="form-group">
      <h5> Projects </h5>
            <div class="col-md-10">

                @for (int i = 0; i < Model.EnumModels.Count; i++)
                {
                    @Html.DisplayFor(m => m.EnumModels[i].ProjectType);
                    @Html.CheckBoxFor(m => m.EnumModels[i].isSelected);
                    @Html.HiddenFor(m => m.EnumModels[i].ProjectType);
                }


                @Html.ValidationMessageFor(model => model.EnumModels, "", new {  
        class = "text-danger" })

            </div>

        </div>

    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>

【讨论】:

  • 是的,你是对的 - 我已经放置了``` @Html.LabelFor(m => m.CheckBoxProjectType[i].ProjectType); ``` 在我的循环中。我正在将@model 添加到帖子中。
  • 我也更新了我的答案。请检查它们。
  • 我有两个模型 - 一个用于员工,一个用于 ProjectType。但在创建视图中,我只使用@model App.Data.Models.Employee。是否可以使用两个模型?
  • 对于创建视图,您可以只使用 Employee 类。但最好是创建一个特殊的视图模型。看我的回答。
  • 你能告诉我在哪里粘贴这个吗?在新文件中?现在我仍然有 CheckBoxProjectType 道具的问题。
【解决方案2】:

使用此代码:

 public ActionResult Create()
{
    Employee model = new Employee();
    model.CheckBoxProjectType = new List<EnumModel>();
    foreach (ProjectType projectType in Enum.GetValues(typeof(ProjectType)))
    {
       model.CheckBoxProjectType.Add(new EnumModel() { ProjectType = projectType, isSelected = false });
    }
    return View(model);
}

并查看:

@using App.Data.Models.Employee;
    
@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
}

<div class="form-horizontal">
    
       <div class="form-group">
            <div class="col-md-10">
                @for (int i = 0; i < Model.CheckBoxProjectType.Count; i++)
                {
                    @Html.DisplayFor(m => m.CheckBoxProjectType[i].ProjectType);
                    @Html.CheckBoxFor(m => m.CheckBoxProjectType[i].isSelected);
                    @Html.HiddenFor(m => m.CheckBoxProjectType[i].ProjectType);
                }

            </div>

        </div>

    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>

【讨论】:

  • 仍然出现此错误:“Employee”不包含“CheckBoxProjectType”的定义,并且找不到接受“Employee”类型的第一个参数的可访问扩展方法“CheckBoxProjectType”(您是否缺少使用指令还是程序集引用?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 2021-06-02
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多