@model IEnumerable<State>
@{
ViewBag.Title = "Index";
}
<h2>State Data</h2>
<p>
@Html.ActionLink("Create New", "CreateState")
</p>
<p>
@using (Html.BeginForm())
{
<p>
Search by Name: @Html.TextBox("searchstring") <br/>
<input type="submit" value="Filter"/>
</p>
}
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Station)
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Station)
</td>
<td>
@Html.ActionLink("Update State Data", "UpdateStation", new {id = item.Id}) |
@Html.ActionLink("Delete", "DeleteState", new {id = item.Id}) | Select to Include in Charts
</td>
</tr>
}
</table>
这是我的代码,我需要为每个项目输入@Html.Checkbox()
,然后将所选项目的值传递给控制器并创建包含这些值的图表。
我知道如何制作图表,我只是不知道如何使用复选框并传递值。
{
[Table("State")]
public class State
{
public State()
{
Orders = new HashSet<Order>();
}
public int Id { get; set; }
[Required]
[StringLength(50)]
[Display(Name = "State")]
public string Name { get; set; }
[Required]
public int Station { get; set; }
public virtual ICollection<Order> Orders { get; set; }
}
}
答案 0 :(得分:3)
Adapted user5103147's DNF to incorporate the Viewmodel idea :)
尽管尝试使用映射而不是继承。
在State
模型中,添加bool
变量。 bool
变量的默认编辑器是一个复选框,如果将其添加到State
模型,则DefaultModelBinder应该将其选中。
至于传递给控制器,也许你应该考虑使用viewmodel。
你的实现看起来有点像这样:
public class StateListViewModel
{
public List<StateViewModel> States { get; set; }
}
public class StateViewModel : State
{
public bool Selected { get; set; }
}
然后您可以访问这些值。我有一个答案here,链接到Darin Dimitrov写的关于View模型的内容,值得一读。
如果实现上述操作,则可以为每个项目提供一个复选框,并将表格放在一个表单中,然后可以使用View模型将其提交给控制器。这将为您提供每个项目的“选定”值,您可以使用它来构建图表。
还应该注意的是,使用您的视图模型继承域模型通常并不总是一个奇妙的想法,但它不会杀了你。更好的选择是创建一个映射器以在两者之间进行映射,或者使用Automapper。
答案 1 :(得分:2)
如果您添加像@Sippy这样的bool字段,请确保将@foreach更改为@for循环,这样您就可以从视图中将完整的集合恢复到控制器
@for (var i = 0; i < Model.Count(); i++)
{
<tr>
<td>
@Html.CheckBoxFor(modelItem => Model[i].Selected) @* new bool field *@
</td>
<td>
@Html.DisplayFor(modelItem => Model[i].Name)
@Html.HiddenFor(modelItem => Model[i].Name)
</td>
<td>
@Html.DisplayFor(modelItem => Model[i].Station)
@Html.HiddenFor(modelItem => Model[i].Station)
</td>
<td>
@Html.ActionLink("Update State Data", "UpdateStation", new { id = Model[i].Id }) |
@Html.ActionLink("Delete", "DeleteState", new { id = Model[i].Id }) | Select to Include in Charts
</td>
</tr>
}
然后您的操作可以接受列表,您可以使用linq获取所选项目
[HttpPost]
public ActionResult Index(IEnumerable<State> model)
{
var selected = model.Where(a => a.Selected == true);