发布ASP.. NET MVC页面部分加载JQuery

本文关键字:加载 JQuery 面部 ASP NET MVC 发布 | 更新日期: 2023-09-27 18:12:06

所以我在一个广告列表页面上工作,我需要允许用户动态地将房间添加到广告中,而无需张贴回页面。我想用Ajax来做到这一点,以减少所需的导航量,从而改善用户体验。

最初我考虑使用Ajax助手方法来加载页面的动态元素。然而,由于MVC/HTML不支持嵌套表单,这并没有很好地工作。

Ajax。BeginForm在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; }
}

发布ASP.. NET MVC页面部分加载JQuery

我设法解决了这个问题,感谢评论中留下的链接。

基本上,这个问题的发生是因为默认的ASP.net MVC模型绑定器只能绑定到一个复杂类型的集合,如果它们可以唯一标识。Phil Haack在下面的文章中对此进行了更清晰的解释:

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/

然而,Phil方法的局限性在于他对集合中的每个元素应用了一个数字索引。当尝试动态添加项时,这种方法会失败,因为索引不是唯一的。注释中给出的第二个链接通过对集合中的每个元素应用Guid来解决这个问题,确保集合中的每个元素都有一个唯一的键。

http://blogs.interknowlogy.com/2014/08/01/mvc-series-part-1-dynamically-adding-items-part-1/

如果Razor视图引擎可以被扩展来缓解这个问题的发生,那将是很有趣的。