将动态添加的列表项发送到控制器

本文关键字:控制器 列表 动态 添加 | 更新日期: 2023-09-27 18:13:16

我有一个局部视图,它有一个视图模型,其中包含一个只有电子邮件和姓名输入的表单。我用jquery ajax将这些数据发布到我的控制器以进行一些验证。我的控制器是一个PartialViewResult方法,见:

    [HttpPost]
    public PartialViewResult InviteUser(InviteEmailViewModel item)
    {
        return PartialView("_InvitedUsers", item);
    }

我的jquery将这个方法的结果添加到DOM中,因为我使用了hiddenfor i get输入,如:

<input data-val="true" data-val-required="Name is required." id="Name" name="Name" type="hidden" value="test">
<input data-val="true" data-val-regex="Invalid Email Address" data-val-regex-pattern="^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+'-+)|([A-Za-z0-9]+'.+)|([A-Za-z0-9]+'++))*[A-Za-z0-9]+@(('w+'-+)|('w+'.))*'w{1,63}'.[a-zA-Z]{2,6}$" data-val-required="Email Address is required." id="Email" name="Email" type="hidden" value="test@test.test">

的问题是,我的ViewModel包含一个列表,但张贴与添加的部分视图的表单后,列表为空。我测试了硬编码输入字段,如:

<input data-val="true" data-val-required="Name is required." id="Name" name="InviteEmailViewModel[0].Name" type="hidden" value="test">

,这似乎是有效的。我如何使MVC生成隐藏字段像在我的硬编码的例子?

将动态添加的列表项发送到控制器

回答你的问:

要在post中包含隐藏字段,这些字段需要在create-in-controller-survive-the-post中存活,如果字段不在表单中,那么它将不会被发送回控制器,无论它之前是否在控制器中创建过。

在表单的任何地方添加隐藏字段,以便它被发送回来。因此,当它被创建时,它将有一个容器,因此将出现在post上。

IE:

@Html.HiddenFor(m => m.myHiddenField)
@Html.TextBoxFor(m => m.displayedField, new { @class = "NotHidden" })

如果我理解正确,你有一个ViewModel与列表,这是部分的模型,你想动态添加到你的VM和绑定后。

要动态地将项添加到列表中,而不使它们变为null,您需要使用BeginCollectionItem,它可以为您处理隐藏的GUID问题。

我有类似的问题,并问了两个问题,有解决方案在这里和这里,后者是访问属性两个模型的问题,但显示更完整的代码。

你得到的问题是与GUID。如果没有帮助,它不会通过帖子返回。

你需要的是一个前缀在名称/id,以便对象可以正确地分配给它的模型,当你发布。

BeginCollectionItem将为您整理-您可以通过在Visual Studio的Package Manager Console中输入Install-Package BeginCollectionItem来获得'stock',查看此指南-在这里或者您可以下载文件/整个东西并通过到GitHub手动将其添加到您的项目中

name="viewmodel[f7d8d024-5bb6-451d-87e3-fd3e3b8c1bba].listOfObjects[d5c08a43-f65e-46d1-b224-148225599edc].objectProperty"是你所需要的动态创建的模型属性,使他们都绑定后发回。

好运。div =)