加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 复杂视图模型中的多个表单 – 如何只绑定其中一

发布时间:2020-12-16 09:59:39 所属栏目:asp.Net 来源:网络整理
导读:我有一个复杂的视图模型,其中包含使用编辑器和显示模板递归渲染的其他对象的集合. 集合中的每个项目都包含一个表单模型,我想将其提交给控制器.请注意,我不想再发布整个视图模型,只是表单模型. 我的问题是MVC将每个对象呈现为集合的一部分,我不知道如何将集合
我有一个复杂的视图模型,其中包含使用编辑器和显示模板递归渲染的其他对象的集合.

集合中的每个项目都包含一个表单模型,我想将其提交给控制器.请注意,我不想再发布整个视图模型,只是表单模型.

我的问题是MVC将每个对象呈现为集合的一部分,我不知道如何将集合中的单个对象绑定到控制器签名中的对象.

我知道我可以使用IEnumerable< Account>再次绑定整个批次,但我试图创建行级别提交而不是整个页面.

如果有人能指出我正确的方向,或者告诉我应该如何在MVC世界中做到这一点(我来自网络表格,所以有点被宠坏了)我会非常感激.

我在下面包含了一个示例HTML片段,还有我要发布的控制器.

<form action="/Home/Index" method="post">
    <input id="Accounts_0__AccountName" name="Accounts[0].AccountName" type="text" value="Account 1" />
    <input id="Accounts_0__AccountId" name="Accounts[0].AccountId" type="hidden" value="dddf5ca7-f8de-4192-b63a-3548f891e293" />
    <input type="submit" value="Submit" />    
</form>                  

<form action="/Home/Index" method="post">
    <input name="Accounts[1].AccountName" type="text" value="Account 2" />
    <input id="Accounts_1__AccountId" name="Accounts[1].AccountId" type="hidden" value="95d75f76-16ef-4cf2-b1e7-5fad782002c5" />
    <input type="submit" value="Submit" />    
</form>

[HttpPost]
public ActionResult Index(Account accounts)
{
   ...
}

解决方法

您可以尝试在编辑器模板中设置前缀:

@model AppName.Models.Account
@{
    ViewData.TemplateInfo.HtmlFieldPrefix = string.Empty;
}
@using (Html.BeginForm("Index","Home"))
{
    @Html.TextBoxFor(x => x.AccountName)
    @Html.HiddenFor(x => x.AccountId)
    <input type="submit" value="Submit" />  
}

如果我没有弄错,应该产生:

<form action="/Home/Index" method="post">
    <input id="AccountName" name="AccountName" type="text" value="Account 1" />
    <input id="AccountId" name="AccountId" type="hidden" value="dddf5ca7-f8de-4192-b63a-3548f891e293" />
    <input type="submit" value="Submit" />    
</form>

显然你意识到通过这样做你最终会得到无效的HTML(你将拥有多个具有相同id的元素).可能的解决方法是手动设置id:

@Html.TextBoxFor(x => x.AccountName,new { id = "some unique value like a GUID" })
@Html.HiddenFor(x => x.AccountId,new { id = "some unique value like a GUID" })

另一种可能性是为Account类型编写一个自定义模型绑定器,它只是在绑定时忽略前缀.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读