如何在 asp.net MVC4 中将集合从视图传递到控制器
How to pass collection from view to controller in asp.net MVC4
我想将一组技能 ID 从我的视图传递到控制器操作,我有一个技能下拉列表:
<select name="skills">
<option value="0">Java</option>
<option value="1">C++</option>
<option value="2">Fortran</option>
<option value="3">ASP</option>
</select>
我希望用户可以 select 下拉列表中的许多技能并将它们的值存储在一个集合中,即一个数组,然后 post 该数组在控制器中进行操作,如下所示 [员工和技能存在多对多关系]:
[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();
}
我怎样才能做到这一点,在此先感谢....
你在前端的选择很少。 Razor,Angular,Jquery...为了简化以下示例中的内容,我使用了 Razor 视图。我认为您不需要将 Skills 作为强类型对象传递,因为您只需要 Id of selected Skills 。同样在示例中,我将技能列表静态/硬编码到剃刀视图中,理想情况下它应该从后端绑定。
假设我们的员工视图模型如下
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; }
}
那么我们的Controller(EmployeeController.cs)就是.(请忽略数据绑定到class后的EF逻辑)
public class EmployeeController : Controller
{
public ActionResult Index()
{
return View("Employee",new EmployeeViewModel());
}
[HttpPost]
public ActionResult AddEmp(EmployeeViewModel employee)
{
var idOfEmployee=AddEmployee(employee);
foreach (var item in employee.SelectedSkills)
{
AddSkill(idOfEmployee,item);
}
return View("Employee");
}
private void AddSkill(int idOfEmployee, int skillId)
{
// your EF logic
}
private int AddEmployee(EmployeeViewModel emp)
{
// your EF logic, get your id of the inserted employee
return 0;
}
}
那么我们的 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"/>
}
我想将一组技能 ID 从我的视图传递到控制器操作,我有一个技能下拉列表:
<select name="skills">
<option value="0">Java</option>
<option value="1">C++</option>
<option value="2">Fortran</option>
<option value="3">ASP</option>
</select>
我希望用户可以 select 下拉列表中的许多技能并将它们的值存储在一个集合中,即一个数组,然后 post 该数组在控制器中进行操作,如下所示 [员工和技能存在多对多关系]:
[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();
}
我怎样才能做到这一点,在此先感谢....
你在前端的选择很少。 Razor,Angular,Jquery...为了简化以下示例中的内容,我使用了 Razor 视图。我认为您不需要将 Skills 作为强类型对象传递,因为您只需要 Id of selected Skills 。同样在示例中,我将技能列表静态/硬编码到剃刀视图中,理想情况下它应该从后端绑定。
假设我们的员工视图模型如下
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; }
}
那么我们的Controller(EmployeeController.cs)就是.(请忽略数据绑定到class后的EF逻辑)
public class EmployeeController : Controller
{
public ActionResult Index()
{
return View("Employee",new EmployeeViewModel());
}
[HttpPost]
public ActionResult AddEmp(EmployeeViewModel employee)
{
var idOfEmployee=AddEmployee(employee);
foreach (var item in employee.SelectedSkills)
{
AddSkill(idOfEmployee,item);
}
return View("Employee");
}
private void AddSkill(int idOfEmployee, int skillId)
{
// your EF logic
}
private int AddEmployee(EmployeeViewModel emp)
{
// your EF logic, get your id of the inserted employee
return 0;
}
}
那么我们的 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"/>
}