C# 如何在asp.net MVC4中将集合从视图传递到控制器
我想将一组技能id从我的视图传递到控制器操作,我有一个技能下拉列表:C# 如何在asp.net MVC4中将集合从视图传递到控制器,c#,asp.net,asp.net-mvc,asp.net-mvc-4,entity-framework-6,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Entity Framework 6,我想将一组技能id从我的视图传递到控制器操作,我有一个技能下拉列表: <select name="skills"> <option value="0">Java</option> <option value="1">C++</option> <option value="2">Fortran</option>
<select name="skills">
<option value="0">Java</option>
<option value="1">C++</option>
<option value="2">Fortran</option>
<option value="3">ASP</option>
</select>
JAVA
C++
Fortran
ASP
我希望用户可以从下拉列表中选择许多技能,并将其值存储在一个集合中,即数组中,然后将该数组发布到controller中的操作中,如下所示[员工和技能之间存在多人关系]:
[HttpPost]
public ActionResult AddEmp(Employee emp ,IEnumerable<Skills> skills )
{
DBCtx db=new DbCtx();
db.employees.Add(emp);
var emp_id=db.SaveChanges();
var employee=db.employees.Find(emp_id);
foreach(item in skills)
{
var skill = db.skills.Find(item);
employee.skills.Add(skill);
}
db.SaveChanges();
return View();
}
[HttpPost]
公共行动结果附录(员工emp、IEnumerable skills)
{
DBCtx db=新的DBCtx();
db.employees.Add(环境管理计划);
var emp_id=db.SaveChanges();
var employee=db.employees.Find(emp_id);
foreach(技能中的项目)
{
var skill=db.skills.Find(项目);
employee.skills.Add(skill);
}
db.SaveChanges();
返回视图();
}
我怎样才能做到这一点,提前感谢….您在前端有很多选择。剃刀,角度,Jquery。。。为了简化以下示例中的内容,我使用了Razor视图。我认为您不需要将技能作为强类型对象传递,因为您只需要所选技能的Id。同样在这个示例中,我将技能列表静态/硬编码到razor视图中,理想情况下,它应该从后端绑定 这么说,让我们假设我们的员工视图模型如下
public class EmployeeViewModel
{
public EmployeeViewModel()
{
SelectedSkills=new List<int>();
}
public int Id { get; set; }
public string Name { get; set; }
public List<int> SelectedSkills { get; set; }
}
public class Skills
{
public int Id { get; set; }
public string Name { get; set; }
}
然后我们的Employee.cshtml视图可以是
@using System.Web.UI.WebControls
@using WebApplication4.Controllers
@model WebApplication4.Controllers.EmployeeViewModel
@{
ViewBag.Title = "Employee";
}
<h2>Employee</h2>
@{var listItems = new List<Skills>
{
new Skills { Id = 0,Name="Java" },
new Skills { Id = 1,Name="C++" },
new Skills { Id = 2,Name="Fortran" }
};
}
@using (Html.BeginForm("AddEmp", "Employee"))
{
@Html.TextBoxFor(m => m.Name, new { autofocus = "New Employee" })
<br/>
@Html.ListBoxFor(m => m.SelectedSkills,
new MultiSelectList(listItems, "Id", "Name",@Model.SelectedSkills)
, new { Multiple = "multiple" })
<input type="submit" value="Submit" class="submit"/>
}
@使用System.Web.UI.WebControls
@使用WebApplication4.Controller
@模型WebApplication4.Controllers.EmployeeViewModel
@{
ViewBag.Title=“员工”;
}
雇员
@{var listItems=新列表
{
新技能{Id=0,Name=“Java”},
新技能{Id=1,Name=“C++”},
新技能{Id=2,Name=“Fortran”}
};
}
@使用(Html.BeginForm(“addamp”、“Employee”))
{
@TextBoxFor(m=>m.Name,新{autofocus=“new Employee”})
@Html.ListBoxFor(m=>m.SelectedSkills,
新的多选列表(列表项,“Id”、“名称”、@Model.SelectedSkills)
,新的{Multiple=“Multiple”})
}
前端的选项非常少。剃刀,角度,Jquery。。。为了简化以下示例中的内容,我使用了Razor视图。我认为您不需要将技能作为强类型对象传递,因为您只需要所选技能的Id。同样在这个示例中,我将技能列表静态/硬编码到razor视图中,理想情况下,它应该从后端绑定
这么说,让我们假设我们的员工视图模型如下
public class EmployeeViewModel
{
public EmployeeViewModel()
{
SelectedSkills=new List<int>();
}
public int Id { get; set; }
public string Name { get; set; }
public List<int> SelectedSkills { get; set; }
}
public class Skills
{
public int Id { get; set; }
public string Name { get; set; }
}
然后我们的Employee.cshtml视图可以是
@using System.Web.UI.WebControls
@using WebApplication4.Controllers
@model WebApplication4.Controllers.EmployeeViewModel
@{
ViewBag.Title = "Employee";
}
<h2>Employee</h2>
@{var listItems = new List<Skills>
{
new Skills { Id = 0,Name="Java" },
new Skills { Id = 1,Name="C++" },
new Skills { Id = 2,Name="Fortran" }
};
}
@using (Html.BeginForm("AddEmp", "Employee"))
{
@Html.TextBoxFor(m => m.Name, new { autofocus = "New Employee" })
<br/>
@Html.ListBoxFor(m => m.SelectedSkills,
new MultiSelectList(listItems, "Id", "Name",@Model.SelectedSkills)
, new { Multiple = "multiple" })
<input type="submit" value="Submit" class="submit"/>
}
@使用System.Web.UI.WebControls
@使用WebApplication4.Controller
@模型WebApplication4.Controllers.EmployeeViewModel
@{
ViewBag.Title=“员工”;
}
雇员
@{var listItems=新列表
{
新技能{Id=0,Name=“Java”},
新技能{Id=1,Name=“C++”},
新技能{Id=2,Name=“Fortran”}
};
}
@使用(Html.BeginForm(“addamp”、“Employee”))
{
@TextBoxFor(m=>m.Name,新{autofocus=“new Employee”})
@Html.ListBoxFor(m=>m.SelectedSkills,
新的多选列表(列表项,“Id”、“名称”、@Model.SelectedSkills)
,新的{Multiple=“Multiple”})
}
A只回发一个值-所选选项的值,您的方法需要是public ActionResult addamp(int-EmpSkills)
才能与表单控件的名称匹配。但你为什么要这么做。使用一个模型并使用强类型HtmlHelper
方法绑定到您的模型(如果您想发布多个值,则dropdownlist需要multiple
属性)@StephenMuecke我想知道如何将其绑定到视图中的模型…您还没有显示您的模型!您需要一个具有IEnumerable SelectedSkills
和IEnumerable SkillsList
的视图模型,并且在视图@Html.DropDownListFor(m=>m.SelectedSkills,model.SkillsList)
(或者对于多选,然后是列表框for(m=>m.SelectedSkills,model.SkillsList)
A只回发一个值-所选选项的值,您的方法需要是public ActionResult addamp(int-EmpSkills)
才能与表单控件的名称匹配。但为什么要这样做呢?使用模型并使用强类型HtmlHelper
方法绑定到模型(如果要发布多个值,则dropdownlist需要multiple
属性)@StephenMuecke我想知道如何将其与视图中的模型绑定……您还没有显示您的模型!您需要一个视图模型,其中包含IEnumerable SelectedSkills
和IEnumerable SkillsList
以及视图中的@Html.DropDownListFor(m=>m.SelectedSkills,model.SkillsList)
(或对于多选,则ListBoxFor(m=>m.SelectedSkills,Model.SkillsList)
但是它如何从上面的Razore视图中选择多个技能尝试运行此示例。它将呈现为一个选择列表,该列表将填充列表并允许您在其中选择多个项目。它将呈现为一个选择元素。它可以正常工作,但存在一个问题,需要按住Ctrl键来选择多个项目,我如何放置che勾选列表中每个项目的复选框…是的。这是预期行为。您需要搜索如何在下拉列表中放置复选框或创建复选框列表。我相信这是另一个问题。请不要忘记标记为答案。没问题。请不要忘了将上面的答案标记为解决方案。您只需将答案标记为正确(绿色复选框图像)。因此,每个人都知道这解决了问题,但它如何从上面的Razore视图中选择多个技能尝试运行此示例。它将呈现为一个选择列表,该列表将填充列表并允许您在其中选择多个项目。它将呈现为一个选择元素。它工作正常,但存在一个问题,需要按住Ctrl键to选择多个项目,如何在列表中选择每个项目时设置复选框…是的。这是预期行为