我希望得到以下内容:
@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对列表的绑定,但我不确定如何根据这些来创建我想要的内容。
答案 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");
}