我是MVC的新手,我正试图弄清楚如何绑定动态列表。
我按照此example和其他示例中的说明创建了我的表格。新项目已成功添加到表格中。但是,在回发时,只有最初添加到列表中的默认项目可用,没有新项目。
这些是我的模特:
public class ItemModel {
public int ID { get; set; }
[Display(Name = "Name")]
public string Name { get; set; }
[Display(Name = "Description")]
public string Description { get; set; }
}
public class MainModel{
public List<ItemModel> Items { get; set; }
public MainModel(){
Items = new List<ItemModel>()
}
}
我的观点:
<table id="list">
<thead>
<tr>
<th style="width: 150px;">
@Html.DisplayNameFor(model => model.Items[0].Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Items[0].Description)
</th>
<th>
Delete
</th>
</tr>
</thead>
<tbody>
@Html.Partial("Item", Model)
</tbody>
</table>
部分视图:
@for (var i = 0; i < Model.Items.Count; i++) {
<tr>
<td>
@Html.TextBoxFor(model => model.Items[i].Name)
</td>
<td>
@Html.TextBoxFor(model => model.Items[i].Description)
</td>
<td>
<button class="btn" type="button" data-id="@Model.Items[i].ID" value="Delete"/>
</td>
</tr>
}
我正在使用Ajax Post向表中添加新项目:
$('.add').click(function () {
var action = "/Project/Add";
$.ajax({
url: action,
cache: false,
success: function (result) {
$("#list").find("tbody").empty().append($(result));
}
});
});
控制器操作:
public ActionResult Add() {
ItemModel item = new ItemModel();
try {
item.ID = ((MainModel)Session["MainModel"]).Items.LastOrDefault().ID + 1;
((MainModel)Session["MainModel"]).Items.Add(item);
} catch (Exception) {
return Json(null);
}
return PartialView("Item", Session["MainModel"]);
}
有些人可以告诉我我做错了吗?
感谢。
答案 0 :(得分:0)
每次调用public ActionResult Add()
时,您可能正在创建一个新的空项。然后设置其Id,然后将其添加到会话中的模型。
“名称”和“描述”属性未设置。
要添加页面中添加的项目,您必须将数据回发到Add()方法中的参数 - 否则没有数据要添加到您的项目中。
此外,传回数据的最后一块:
return PartialView("Item", Session["MainModel"]);
将其强制转换为MainModel可能更好:
(MainModel)Session["MainModel"]