我有一个像这样的列表视图:
@model List<ABC.Models.InfoDetails>
我使用for循环来显示表中的值,以便能够编辑每一行并使用提交按钮(在表的底部)将数据发布回控制器。
@using (Html.BeginForm("UpdateUsers", "User")) {
<table ...
<tbody>
@for (var i = 0; i < Model.Count(); i++) {
...
}
这些值会像这样回复:
[0].Title
[1].Title
等
这很好,我在控制器中得到正确的值。
我遇到的唯一问题是从每行的select2下拉列表中发布所选值。
<select class="js-select2 form-control" name="user" id="select2-user">
名称值(&#34;用户&#34;)发布到控制器而不是名称[0].User
我的Javascript:
var users = [
{ id: '0', text: 'Please choose...' },
{ id: '1', text: 'Paul' }
];
$("[name='user']").select2({
placeholder: "Select a user",
data: users
});
有没有办法将值放到每个用户属性的相应索引上?
我希望你能帮助我。
答案 0 :(得分:2)
始终使用HtmlHelper
方法生成正确的html(包括name
属性)并绑定到您的模型。我还建议您为控制器中的选项生成集合并将其传递给模型,而不是在视图中生成它们。理想情况下,您可以使用视图模型
public class InfoDetailsVM
{
public IEnumerable<User> UserList { get; set; }
public List<InfoDetails> Details { get; set; }
}
请注意,假设您的User
类包含属性int ID
和string Name
和GET方法
InfoDetailsVM model = new InfoDetailsVM
{
Details = ... // your current query for the collection of InfoDetails
};
ConfigureViewModel(model);
return View(model);
ConfigureViewModel()
private void ConfigureViewModel(InfoDetailsVM model)
{
model.UserList = ... // your code to return a collection of Users
}
在视图中
@model InfoDetailsVM
....
@for(int i = 0; i < Model.Details.Count; i++)
{
@Html.LabelFor(m => m.Details[i].User)
@Html.DropDownListFor(m => m.Details[i].User,
new SelectList(Model.UserList, "ID", "Name", Model.Details[i].User,
"Select a user",
new { @class = "js-select2 form-control" }
)
@Html.ValidationMessageFor(m => m.Details[i].User)
....
}
并且脚本将只是
$('.js-select2').select2();
附注:
ConfigureViewModel()
方法允许您调用它
POST方法(没有重复代码),如果你需要这样做
ModelState
无效,您需要返回该视图。答案 1 :(得分:1)
@Html.DropDownListFor(items => Model[i].UserID,
new SelectList(@Model.Users, "id", "text", @Model.Users[i].id),
new
{
@class = "select2-hidden-accessible",
@aria_hidden = "true"
})
尝试使用razor语法进行渲染。并给class = "select2-hidden-accessible"