具有文本输入字段的MVC对复选框

时间:2015-08-11 18:28:54

标签: c# asp.net-mvc

我希望得到以下内容:

@foreach(var option in ViewBag.OptionsAvailable)
{
        //the 'option' variable will be used in these fields, of course
        <input type='checkbox' name='thingToUse' />
        <input type='text' name='textToSaveForThing' />
}

ViewBag.OptionsAvailable可以是可变长度的。 我想选择其中一个选项,并将其添加到Model.Options,并使用保存的值选择其复选框。这里的想法是,在HttpPost控制器方法上,如果选中相应的复选框,我只想确认/保存文本框中的值。什么是最好的方法来解决这个问题?

我遇到了this explanation对列表的绑定,但我不确定如何根据这些来创建我想要的内容。

2 个答案:

答案 0 :(得分:5)

首先创建一个视图模型来表示您想要显示/编辑的内容

public ActionResult Edit()
{
  List<OptionVM> model = new List<OptionVM>();
  .... // populate it
  return View(model);
}

然后在控制器中,初始化视图模型的集合并将其传递给视图

@model List<yourAssembly.OptionVM>
@using (Html.BeginForm())
{
  for (int i = 0; i < Model.Count; i++)
  {
    <label>
      @Html.CheckBoxFor(m => m[i].IsSelected)
      <span>@Model[i].Text</span>
    </label>
    @Html.TextBoxFor(m => m[i].Answer)
    @Html.ValidationMessageFor(m => m[i].Answer)
  }
  <input type="submit" ... />
}

和视图

public ActionResult Edit(List<OptionVM> model)
{
  // for example, get the answers where the checkbox has been selected
  var selectedAnswers = model.Where(m => m.IsSelected).Select(m => m.Answer);
}

并提交至

[RequiredIfTrue]

您可以使用应用于Answer属性的foolproof vbCRLF或类似验证属性来增强此功能,以确保在选中相应的复选框时文本框具有值

答案 1 :(得分:1)

无需输入两个输入。您可以使用&#34;值&#34;复选框的属性,并存储该信息。此外,在控制器中,您只需添加一个与输入名称相同的参数。

查看

@using (Html.BeginForm())
{
    foreach (string option in ViewBag.OptionsAvailable)
    {
        <input type='checkbox' name='checkboxes' value="@option" />
        @option <!-- text to display -->
    }
    <button type="submit">Submit</button>
}

<强>控制器

[HttpGet]
[ActionName("Index")]
public ActionResult GetCar()
{
    ViewBag.OptionsAvailable = new List<string>
    {
        "Red",
        "Yellow",
        "Blue"
    };
    return View(new Car());
}

[HttpPost]
[ActionName("Index")]
public ActionResult PostCar(string[] checkboxes)
{
    Car car = new Car
    {
        ColorsSelected = new List<string>()
    };

    foreach (string value in checkboxes)
    {
        car.ColorsSelected.Add(value);
    }
    return RedirectToAction("Index");
}