4

我目前有一个对象Tag定义如下:

public class Tag
{
    public string Name { get; set; }
}

现在,这是一个模型的集合属性,我将其定义为:

public class MyModel
{
    public string Name { get; set; }
    public IList<Tag> Tags { get; set; }
}

在我看来,我有以下代码:

@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(m => m.Name)
        @Html.TextBoxFor(m => m.Name)
    </div>

    <div>
        <!--
        Here I'd like a collection of checkbox inputs, where the selected names
        get passed back to my controller via the IList<Tag> collection
        -->
    </div>

    <input type="submit" value="Submit" />
}

如何通过模型的 IList 集合返回复选框组中的选定项目(在注释中指定)?

4

3 回答 3

8

使用编辑器模板

要拥有复选框,请在您的类中添加另一个 ProeprtyTag以指定它是否被选中。

public class Tag
{
    public string Name { get; set; }
    public bool IsSelected { set; get; }
}

现在从您的GET操作中,您可以在模型的Tags属性中设置标签列表并将其发送到视图。

public ActionResult AddTag()
{
    var vm = new MyModel();

    //The below code is hardcoded for demo. you mat replace with DB data.
    vm.Tags.Add(new Tag { Name = "Test1" });
    vm.Tags.Add(new Tag { Name = "Test2" });

    return View(vm);
}

现在让我们创建一个编辑器模板,转到 TheView/YourControllerName并创建一个名为的文件夹EditorTemaplates,并在那里创建一个与 Property 类型 ( ) 同名的新视图Tag.cshtml

在此处输入图像描述

现在将此内容添加到新的编辑器模板中。

@model Tag
<p>
  <b>@Model.Name</b>   :
  @Html.CheckBoxFor(x => x.IsSelected) <br />
  @Html.HiddenFor(x=>x.Name)
</p>

EditorFor现在在您的主视图中,使用Html Helper 方法调用您的编辑器模板。

@model MyModel
<h2>AddTag</h2>
@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(m => m.Name)
        @Html.TextBoxFor(m => m.Name)
    </div>    
    <div>  
      @Html.EditorFor(m=>m.Tags)         
    </div>    
    <input type="submit" value="Submit" />
}

现在,当您发布表单时,您的模型将具有标签集合,其中选定的复选框将具有 TrueIsSelected属性值。

 [HttpPost]
public ActionResult AddTag(MyModel model)
{
   if(ModelState.IsValid)
   {
      //Check for model.Tags collection and Each items IsSelected property value.
      //Save and Redirect(PRG pattern)
   }
   return View(model);
}

像这样

在此处输入图像描述

于 2012-08-22T12:44:28.790 回答
1

这类似于我在我正在工作的网站上所做的事情。

我使用了这个扩展@Html.CheckBoxListFor()

希望这可以帮助。

于 2012-08-22T12:38:39.077 回答
0

如果您可以将 bool IsChecked 属性添加到您的 Tag 模型,那么您可以在循环中使用 EditorFor(或 CheckBoxFor)。诀窍是使用带有索引器(而不是 foreach)的 for 循环,以便您通过视图主模型访问属性。然后,modelbinder 将为您完成其余的工作,因此您的 POST 操作将接收 MyModel,其 Tags IsChecked 属性设置为正确的状态。

楷模:

public class Tag
{
    public string Name { get; set; }
    public bool IsChecked { get; set; }
}

public class MyModel
{
    public string Name { get; set; }
    public List<Tag> Tags { get; set; }
}

风景:

@model MyMvcApplication.Models.MyModel
@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(m => m.Name)
        @Html.TextBoxFor(m => m.Name)
    </div>

    <div>
        @for (int i = 0; i < Model.Tags.Count; i++)
        {
            @Html.DisplayFor(x => Model.Tags[i].Name)
            @Html.EditorFor(x => Model.Tags[i].IsChecked)
        }
    </div>
    <input type="submit" value="Submit" />
}
于 2012-08-22T13:13:36.360 回答