如何将我的列表从我的控制器发送到视图中的DropDownList?

时间:2018-02-03 13:40:25

标签: c# asp.net-mvc razor

我知道它应该是这样的

@Html.DropDownList("yourDropName", listItems, new { @class = "form-control" })

但是我无法弄明白我应该怎么做 在我的控制器中,我将一个列表传递给它,它在我的模型层中初始化,在我的View_Model中,我只是从模型中获取它并将其传递给我的控制器

这是在我的模型中

    public List<int?> TeamId()
    {
        ListTeam = new List<int?>();
        using (var context = new EF_Model.DigikalaHREntities())
        {
            //var p = context.Members.Any(c => c.TeamId);
            var p = from c in context.Members
                    where c.TeamId.HasValue
                    select new { c.TeamId };
            return p.Select(m => m.TeamId).ToList();
        }
    } 

我的视图模型中有2个类,第一个只是带有一些数据注释的实体,第二个是我从模型中获取方法的类 所以这是我的View模型图层(我没有把这个传递给我的View)

     public List<int?> GetTeamId()
    {
        Ref_CRUD = new Models.CRUD.Member();
        return Ref_CRUD.TeamId();
    } 

我的控制器

  #region [- Get -]
    public ActionResult Create()
    {
        Ref_Member = new View_Model.Buisiness.Member();
        return View(Ref_Member.GetTeamId());
    }

这是我的观点

@model DigikalaHR.View_Model.Entitys.Member
 . 
 .
 .
 .
 <div class="form-group">
        @Html.LabelFor(model => model.TeamId, "TeamId", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">       
 //don't know how to use one of These  two lines and which one i should use 
            @*@Html.DropDownList("TeamId",new SelectList(enum.(typeof())),htmlAttributes: new {@class="form-control" })*@
           @*@Html.DropDownListFor(m => m.TeamId,new SelectList(Enum.GetValues(typeof(id))),"GetTeamId")*@
            @Html.ValidationMessageFor(model => model.TeamId, "", new { @class = "text-danger" })
        </div>
    </div>

如何将我的列表从我的控制器发送到View中的DropDownList?

1 个答案:

答案 0 :(得分:1)

我认为你在这里混合了一些东西。您的视图模型应该是特定于视图的模型,而这些模型只是用于数据传输的愚蠢的POCO类。没有业务逻辑或那些不知道您的数据访问技术/实体类是什么。不要将视图模型与实体类混合。

因此,在您的情况下,如果您的视图是创建成员,那么您应该拥有一个视图模型,其中包含视图中绝对需要的属性(对于输入元素)

public class CreateMemberVm
{
   public string FirstName { set;get;}
   public int? SelectedTeamId { set;get;}
   public List<SelectListItem> Teams { set;get;}
   // Add other properties as needed by the view. 
}

视图需要为视图模型添加其他属性。没有理由盲目地将实体类中的所有属性添加到视图模型中。

现在在您的GET操作中,初始化此视图模型的对象,使用Teams对象列表将SelectListItem属性弹出(我们将在视图中使用它来构建SELECT元素选项) )并将对象发送到vieww

public ActionResult Create()
{
   var vm = new CreateMemeberVm();
   vm.Teams = GetTeamItems();
   return View(vm);
}
public List<SelectListItem> GetTeamItems()
{
    using (var db = new EF_Model.DigikalaHREntities())
    {
        return db.Teams
                 .Select(a=>new SelectListItem { 
                                                 Value=a.TeamId.ToString(),
                                                 Text=a.TeamName
                                               })
                  .ToList();
    }
}

现在在您的视图中,应该对我们的视图模型进行强类型化,您可以使用DropDownListFor辅助方法来呈现SELECT元素。

@model CreateMemberVm
@using(Html.BeginForm())
{
   @Html.LabelFor(a=>a.FirstName)
   @Html.TextBoxFor(a=>a.FirstName)

   @Html.LabelFor(a=>a.SelectedTeamId)
   @Html.DropDownListFor(m => m.SelectedTeamId, Model.Teams, "Select team")
   <input type="submit" />
}

您可以使用相同的视图模型类作为HttpPost操作方法的参数,现在当用户在填写表单后提交表单时,将填充SelectedTeamId属性和FirstName属性表格数据,您可以使用它们保存到您的表格

[HttpPost]
public ActionResult Create(CreateMemeberVm model)
{
  // check model.FirstName and model.SelectedId
  // to do : Save as needed
  // to do : return something
}

如果要在视图中预选一个项目(对于编辑成员用例),您只需将视图模型的SelectedTeamId属性设置为数据库中的任何属性即可。

public ActionResult Edit(int id)
{
   var m = db.Members.Find(id);
   var vm = new CreateMemeberVm() { FirstName = m.FirstName, SelectedTeamId=m.TeamId};
   vm.Teams = GetTeamItems();
   return View(vm);
}