我有一个部分视图,其中包含一个只包含电子邮件和名称输入的表单的视图模型。我用jquery ajax将这些数据发布到我的控制器上进行一些验证。我的控制器是PartialViewResult方法,请参阅:
[HttpPost]
public PartialViewResult InviteUser(InviteEmailViewModel item)
{
return PartialView("_InvitedUsers", item);
}
我的jquery将这个方法的结果添加到DOM,因为我使用hiddenfor i得到输入,如:
<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包含一个List但是在发布带有添加的partialviews的表单后,List是Null。我已经使用硬编码输入字段测试过:
<input data-val="true" data-val-required="Name is required." id="Name" name="InviteEmailViewModel[0].Name" type="hidden" value="test">
这确实有效。我如何使MVC生成隐藏的字段,就像在我的硬编码示例中一样?
答案 0 :(得分:3)
回答你的问题:
要在帖子中包含隐藏字段,这些字段需要“生存”。如果字段不在表单中,则创建控制器存活在帖子中,然后它不会被发回给控制器,无论它是否在之前创建控制器。
在表单中的任意位置添加隐藏字段,以便将其回发。因此,当它被创建时,它将有一个容器,因此会在帖子上出现。
IE:
@Html.HiddenFor(m => m.myHiddenField)
@Html.TextBoxFor(m => m.displayedField, new { @class = "NotHidden" })
它可能是什么:
如果我正确理解您已经拥有一个带有List的ViewModel,这是您想要动态添加到VM并在帖子上绑定的部分模型。
要动态地将项目添加到列表中,而不将它们设为null,您需要使用BeginCollectionItem
来处理隐藏的GUID问题。
我遇到了类似的问题,并提出了两个问题,其中包含解决方案here和here,后者是访问属性两个模型的问题,但显示更完整的代码。
您遇到的问题与GUID有关。没有帮助,它不会回过头来。
您需要的是名称/ ID中的前缀,以便在发布时可以将对象正确分配给其模型。
BeginCollectionItem将为您排序 - 您可以获得&#39; stock&#39;通过在Visual Studio的软件包管理器控制台中键入Install-Package BeginCollectionItem
,查看本指南 - here,或者您可以下载文件/整个文件并通过转到GitHub here手动将其添加到项目中
name="viewmodel[f7d8d024-5bb6-451d-87e3-fd3e3b8c1bba].listOfObjects[d5c08a43-f65e-46d1-b224-148225599edc].objectProperty"
是动态创建的模型属性所需要的,因此它们都会在回发后绑定。