C# 复选框列表MVC部分
我有以下视图模型代码:C# 复选框列表MVC部分,c#,asp.net-mvc,asp.net-mvc-4,asp.net-mvc-partialview,C#,Asp.net Mvc,Asp.net Mvc 4,Asp.net Mvc Partialview,我有以下视图模型代码: public class TestCheckboxlistParentModel { public TestCheckboxlistParentModel() { CBL = new TestCheckboxlistModel(); } public TestCheckboxlistModel CBL { get; set; } } public class TestCheckboxlistModel { publ
public class TestCheckboxlistParentModel
{
public TestCheckboxlistParentModel()
{
CBL = new TestCheckboxlistModel();
}
public TestCheckboxlistModel CBL { get; set; }
}
public class TestCheckboxlistModel
{
public string TextField { get; set; }
public IList<string> SelectedFruits { get; set; }
public IList<SelectListItem> AvailableFruits { get; set; }
public TestCheckboxlistModel()
{
SelectedFruits = new List<string>();
AvailableFruits = new List<SelectListItem>();
}
}
控制器:
public ActionResult TestCheckboxlist()
{
var model = new TestCheckboxlistParentModel
{
CBL = new TestCheckboxlistModel()
{
AvailableFruits = GetFruits()
}
};
return View(model);
}
[HttpPost]
public ActionResult TestCheckboxlist(TestCheckboxlistParentModel model)
{
if (ModelState.IsValid)
{
// Save data to database, and redirect to Success page.
return RedirectToAction("Success");
}
//model.AvailableFruits = GetFruits();
return View(model);
}
public ActionResult Success()
{
return View();
}
private IList<SelectListItem> GetFruits()
{
return new List<SelectListItem>
{
new SelectListItem {Text = "Apple", Value = "1"},
new SelectListItem {Text = "Pear", Value = "2"},
new SelectListItem {Text = "Banana", Value = "3"},
new SelectListItem {Text = "Orange", Value = "4"},
};
}
局部视图:
@model Web.ViewModels.TestCheckboxlistModel
<div class="form-group">
@Html.LabelFor(model => model.TextField)
<div class="col-md-10">
@Html.EditorFor(model => model.TextField)
</div>
</div>
@foreach (var item in Model.AvailableFruits)
{
<div class="checkbox">
<label>
<input type="checkbox"
name="@Html.IdFor(p=>p.SelectedFruits)"
value="@item.Value" /> @item.Text
</label>
</div>
}
视图:
问题是SelectedFruits在post方法中始终没有任何元素。如果我不使用嵌套的局部视图,同样的代码也可以正常工作。属性TextField可以很好地处理部分
另外,这不是一个复杂的问题。这个问题是我回答的基础。在我的例子中,我需要在局部视图中有一个复选框列表,它不工作 您可以使用name=@Html.IdForp=>p.SelectedFruits生成name=CBL\u SelectedFruits,但是为了绑定到您的模型,您需要name=CBL.SelectedFruits注意。点,而不是可以使用
name="@Html.NameFor(p => p.SelectedFruits)"
但是,您的代码还有其他问题。您没有强绑定到您的模型,您没有得到任何验证,您在不需要时为属性AvailableFruits生成IList它可能只是IList AvailableFruits,最重要的是,如果您返回视图,用户选中的所有复选框都将丢失所有复选框都将被取消选中
更改视图模型,以便可以强绑定到属性
public class FruitVM
{
public string Name { get; set; }
public bool IsSelected { get; set; }
}
public class ParentVM
{
public string TextField { get; set; }
public List<FruitVM> Fruits { get; set; }
}
在我看来
@Html.ParentVM
....
@using (Html.BeginForm())
{
@Html.LabelFor(m => m.TextField)
@Html.EditorFor(m => m.TextField)
@Html.EditorFor(m => m.Fruits)
<input type="Submit" value="Save" />
}
可能的重复项看起来您已从该问题中获得帮助。在输入/复选框的局部视图中,将名称更改为SelectedFruits@Text将分部放在视图的编辑文件夹中,并调用主视图上的模板编辑器。我的猜测是,由于您只呈现部分而不是编辑模板,视图没有像应该的那样将父信息添加到ID中。这是一种创建复选框列表的奇怪方式。建议您参考@davidele中的代码,这不是一个可疑的例外!谢谢你的解释!最后,我在ASP.NETMVC中为复选框列表提供了一个良好而灵活的解决方案,没有粗糙的硬编码内容等。
ParentVM model = new ParentVM
{
Fruits = new List<FruitVM>{
new FruitVM{ Name = "Apple" },
new FruitVM{ Name = "Pear" },
....
}
};
return View(model);
@model FruitVM
@Html.CheckBoxFor(m => m.IsSelected)
@Html.LabelFor(m => m.IsSelected, Model.Name)
@Html.ParentVM
....
@using (Html.BeginForm())
{
@Html.LabelFor(m => m.TextField)
@Html.EditorFor(m => m.TextField)
@Html.EditorFor(m => m.Fruits)
<input type="Submit" value="Save" />
}
[HttpPost]
public ActionResult TestCheckboxlist(ParentVM model)
{
....
List<string> selectedFruits = model.Fruits.Where(x => x.IsSelected);