【发布时间】:2016-10-07 12:36:48
【问题描述】:
所以我正在开发一个广告列表页面,我需要允许用户在不发回页面的情况下动态地将房间添加到广告中。我想使用 Ajax 来减少所需的导航量,从而改善 UX。
最初,我研究了使用 Ajax 辅助方法来加载页面的动态元素。但是,由于 MVC/HTML 不支持嵌套表单,因此效果不佳。
Ajax.BeginForm inside Html.BeginForm
我最终使用了一些 JQuery 来加载房间并添加/删除房间。 JQuery 在添加/删除房间后调用控制器上的操作以加载房间。
$("[name='RemoveRoom']").click(function () {
var url = $(this).data('url');
$('#roomsWrapper').load(url);
});
[HttpGet]
public ActionResult GetRooms(int Id)
{
var viewModel = this.roomAvailableAdvertStore.FindById(Id);
return PartialView("_Rooms", viewModel.Rooms);
}
我现在面临的问题是,当我提交表单时,这些动态加载的元素没有绑定到视图模型。解释的更清楚
<form>
@Html.HiddenFor(m => m.AdvertId);
<div id=”roomsWrapper”>
// These data items are not being bound to the model.
@Html.Partial(“_Rooms”, Model.Rooms);
</div>
<input type="submit" />
<form>
_Rooms.cshtml 部分页面如下所示:
@model List<RoomViewModel>
@for (int roomIndex = 0; roomIndex < Model.Count(); roomIndex++)
{
@Html.HiddenFor(m => m[roomIndex].RoomId)
}
表单回传到具有以下签名的操作:
public async Task<ActionResult> Update(RoomAvailableAdvertViewModel model)
{
...
}
视图模型如下所示:
public class RoomAvailableAdvertViewModel
{
public int AdvertId { get; set; }
public List<RoomViewModel> Rooms { get; set; }
}
【问题讨论】:
-
?我猜是错字吗?您的问题目前尚不清楚
-
是的,谢谢我已经更正了。
-
_Rooms 部分是什么样的?表单在哪里提交?
-
看看这篇博文。它解释了使用 begincollection 处理动态数据。 blogs.interknowlogy.com/2014/08/01/…
-
请参阅 this answer 了解动态添加(和删除)集合项的选项
标签: c# jquery ajax asp.net-mvc ajaxhelper