我需要从视图

时间:2015-07-10 13:37:42

标签: asp.net-mvc

@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; }
    }
}

2 个答案:

答案 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);

DotNetFiddle Example