MVC如何为包含列表作为属性的模型创建表单

时间:2015-02-27 11:47:35

标签: c# asp.net-mvc model

所以我有这个简单的模型:

public class OptOut
    {
        public int optOutID { get; set; }
        public bool hasOptedOut { get; set; }        
        public List<Cohort> list { get; set; }

        public OptOut()
        {
            List<Cohort> list = new List<Cohort>();
            list.Add(new Cohort());
            list.Add(new Cohort());
            list.Add(new Cohort());
            list.Add(new Cohort());
            this.list = list;
        }

    }

您可以在其中看到其中一个属性是ListCohort个对象。 Cohort对象有一些简单的布尔属性:

public class Cohort
    {
        public bool ukft { get; set; }
        public bool ukpt { get; set; }
        ...etc
    }

我想创建一个循环遍历Cohort对象列表的表单。

因此,在我的Controller我将模型传递给View

public ActionResult Page()
        {                        
            return View(new OptOut());
        }

然后在html中我创建了一个这样的表单:

 @using (Html.BeginForm("OptedOut", "Home"))
        {            var m = Model.list;

            <div id="radios" class="form-group" style="margin-top:25px;">
                @Html.RadioButtonFor(model => Model.hasOptedOut, true) <span style="margin-right:8px;">Yes</span>
                @Html.RadioButtonFor(model => Model.hasOptedOut, false) <span>No</span> <br />

                //here I would normally loop through the list but I'm changing only the first element for testing purposes
                @Html.RadioButtonFor(model => m.ElementAt(0).ukft, true) <span style="margin-right:8px;">Yes</span>
                @Html.RadioButtonFor(model => m.ElementAt(0).ukft, false) <span>No</span> <br />
            </div>

            <div class="form-group">
                <input id="confirm" type="submit" value="Confirm" class="btn btn-success btn-lg"/>
            </div>
        }

到目前为止一切顺利。如您所见,我添加了两组单选按钮 - 一个用于hasOptedOut模型中的简单OptOut布尔属性,另一个用于第一个元素的ukft属性。 List

现在,当我在两组单选按钮中选择是(true)时,我应该看到hasOptedOut = trueukft = true对象中的Cohort List。所以我在POST之后在控制器中得到了模型:

[HttpPost]
public ActionResult OptedOut(Dlhe.Smart.Models.OptOut optout)
{                
    return View("some_view");
}

hasOptedOut确实如此。但是,ukft在列表中仍然为false。所以我认为Lists不是那么简单,但我该如何解决这个问题?

编辑:

正如所建议的那样,我试过这样做,没有运气:

@using (Html.BeginForm("OptedOut", "Home"))
        {            var m = Model.list;
            for (int i=0; i<Model.list.Count(); i++) {

                <div id="radios" class="form-group" style="margin-top:25px;">

                    @Html.RadioButtonFor(model => m[i].ukft, true) <span style="margin-right:8px;">Yes</span>
                    @Html.RadioButtonFor(model => m[i].ukft, false) <span>No</span> <br />
                </div>                
            }

                <div class="form-group" style="margin-top:25px;">
                    <input id="confirm" type="submit" value="Confirm" class="btn btn-success btn-lg"/>
                </div>
        }

1 个答案:

答案 0 :(得分:1)

我认为最简单的方法是为您的类型创建一个EditorTemplate。

创建EditorTemplate:

1)在Views / Shared文件夹中创建一个名为Editor Templates

的新文件夹

2)在该文件夹中,创建一个新的强类型局部视图,其中您的类型名称为文件名。 E.G Cohort.cshtml看起来像:

@model Models.Cohort

@Html.RadioButtonFor(model => model.ukft, true) <span style="margin-right:8px;">Yes</span>
@Html.RadioButtonFor(model => model.ukft, false) <span>No</span> <br />

3)在主视图中使用@ Html.EditorFor(model =&gt; model.list),razor将为列表中的每个同类群组渲染在步骤2中创建的局部视图。

相关问题