MVC PartialView 中的多个表单在回发时返回 null,除了列出的第一个表单之外

2024-02-28

好的,我希望有人可以帮助我解决这个问题(提前致谢!)。我正在使用MVC4。

我的 ContractsModel 包含(除其他外)ContractModel 列表。在我的部分视图中,我循环遍历列表,为每个列表创建一个表单。到目前为止,一切都很好。问题出在回发上。第一种形式总是很好地回发。但其他(2、3、4 等)始终返回 null。

我已经检查了调试工具并确认渲染的控件已正确命名。

<select name="Contracts[0].OrganizationId" id="Contracts_0__OrganizationId">
<select name="Contracts[1].OrganizationId" id="Contracts_1__OrganizationId">
<select name="Contracts[2].OrganizationId" id="Contracts_2__OrganizationId">

我还确认客户端确实正在将数据返回到服务器,但由于某种原因,它似乎没有附加回我的 ActionResult 所期望的模型中。有任何想法吗?

为了简洁起见,我已经最小化了我的代码。

这是我的模型:

public class ContractsModel
{
    public ContractsModel()  
    {
        this.Contracts = new List<ContractModel>();

        this.OrganizationList = new List<SelectListItem>();
        this.ContractNumList = new List<SelectListItem>();
    }

    public string ParentProjectId { get; set; }
    // etc, etc .....

    public List<ContractModel> Contracts { get; set; }

    public List<SelectListItem> OrganizationList { get; set; }
    public List<SelectListItem> ContractNumList { get; set; }
}


public class ContractModel
{
    public string OrganizationId { get; set; }
    public string Organization { get; set; }
    public string ContractNumId { get; set; }
    public string ContractNum { get; set; }
}

这是我的控制器操作

[HttpPost]
public ActionResult _ContractsEdit(ContractsModel model)
{

    if (ModelState.IsValid) {
        //blah, blah, blah....
    }

    return PartialView("Index", ProjectModel);
}

这是我的部分视图

@model Manager.Models.ContractsModel

@for (int i = 0; i < Model.Contracts.Count(); i++)  
{
    var divId = "divContractsModelItem_" + (i + 1);
    var saveButtonId = "btnContractsEditSave_" + (i + 1);


    <div id = "@divId">  

        @using (Html.BeginForm("_ContractsEdit", "Projects", FormMethod.Post))
        {      
            <fieldset>
                <legend>General:</legend>

                <div>
                    <label>Contracting Organization:</label>
                    @Html.DropDownListFor(model => model.Contracts[i].OrganizationId, new SelectList(Model.OrganizationList, "value", "text", Model.Contracts[i].OrganizationId))
                </div>

                <div>
                    <label>Contract Number:</label>
                    @Html.DropDownListFor(model => model.Contracts[i].ContractNumId, new SelectList(Model.ContractNumList, "value", "text", Model.Contracts[i].ContractNumId))
                </div>

                <div>
                   <button id="@saveButtonId" type="submit">Save</button>
                </div>

            </fieldset>
        }
    </div> 

} 

由于我的评论对您有帮助,我想我会将它们充实为完整的答案。

模型绑定的问题在于它不允许您跳过数组索引 - 一旦跳过一个索引,它就会停止绑定。您的页面有多种表单,每个合同对应一个表单。因此,第二个和后续形式不会从索引 0 开始 - 它们从索引 1 开始,然后是索引 2,依此类推。因此,模型绑定立即失败,并且您会得到一个传递到控制器的空对象。

简单的解决方案是转移到单一表单,以便模型绑定可以访问 Contract 对象的所有索引,然后在控制器中使用额外的代码来确定按下了哪个提交按钮。

不过,我不确定这是最好的解决方案,因为从 HTTP 的角度来看,多个表单和提交按钮更好 https://stackoverflow.com/questions/8712398/multiple-forms-or-multiple-submits-in-a-page,因为它减少了发布到服务器的不必要的数据量。然而,最好是好的敌人,如果单一形式有效......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVC PartialView 中的多个表单在回发时返回 null,除了列出的第一个表单之外 的相关文章

  • ASP.NET MVC - ValidateAntiForgeryToken 过期

    在网页中 我们提供一个超链接 GET 用户可以单击该超链接进行身份验证 Html ActionLink Please Login MyMethod MyController 这映射到以下返回视图的控制器方法 RequireHttps pub
  • 如何在 Web Api 中将对象作为参数传递

    我想在我的 web api GET 和 POST 方法中将对象作为参数传递 我的代码是 HttpGet Route mytest list model public IHttpActionResult GetAllTypes TestMod
  • ASP.NET MVC 5 基于用户角色自定义 Bootstrap 导航栏

    我正在使用 ASP NET MVC 5 内置身份验证方法 我想根据用户所处的角色显示和隐藏链接 在菜单导航栏中 有人达到这个目的了吗 从哪里开始 只需将您的链接包含在 if User IsInRole SomeRole
  • 服务层或存储库中的密码哈希等?

    作为 MVC 的最佳实践 在发送到数据库之前处理密码散列 加盐或数据格式化等事务的逻辑应该放在哪里 我读到存储库应该仅用于处理数据访问的逻辑 这是属于服务层的东西吗 控制器 这还重要吗 我倾向于将散列放在存储库层中 如果只是出于实际原因 即
  • 在 MVC 中使用 Request.URL 和 Request.URLReferrer 获取当前链接的替代方案?

    我希望在我的中编写一个方法 属性BaseController允许任何操作获取当前 URL 的类 如果我打电话localhost Keyword Edit 1我可以用Request Url获取网址 但是 如果我的编辑视图中有部分视图 我需要使
  • 使用简单的 ActionFilterAttribute 运行时出错

    开始编写一个简单的过滤器 从每个操作加载的请求中提取一些内容 从其他 stackoverflow 复制一些代码 如下所示 public class TestKeyAttribute ActionFilterAttribute public
  • 从 MVC 控制器返回 JSON 字符串

    我使用以下代码将对象发送 接收到我的 mvc 控制器 ajax url createOrUpdateTimeRecord data JSON stringify data type POST dataType json contentTyp
  • ASP.NET MVC - 授权属性登录重定向后保留 POST 数据

    我有一个带有评论的博客文章页面 任何用户 无论是否登录 都可以在页面底部看到一个表单来发表评论 当用户输入评论且未获得授权时 用户将被重定向到登录 注册页面 登录后 用户将被重定向回操作 但包含评论正文的 POST 数据会丢失 我使用 AS
  • Windows 身份验证在 IISExpress 中有效,但在 IIS 中无效

    我有一个奇怪的问题 我正在 Visual Studio 2013 中使用最新的 MVC5 我正在尝试创建一个托管匿名 API 的站点以及一个需要通过 Windows 身份验证的 Intranet 域凭据的管理仪表板 当通过 IIS Expr
  • MVC .NET 如何为现有源代码添加单元测试项目?

    我已经创建了 MVC 项目 VS2008 NET 3 5 第一次VS2008问我 您想为此应用程序创建单元测试项目吗 我选择否 现在我意识到它变得越来越复杂 TDD 测试驱动开发 方法会更好 但无法找到如何在我的解决方案中添加单元测试项目
  • MVC 6 控制器中的 ControllerContext 和 ViewEngines 属性在哪里?

    我创建了一个新的 MVC6 项目并构建了一个新站点 目标是获得视图的渲染结果 我找到了以下代码 但我无法让它工作 因为我找不到ControllerContext和ViewEngines 这是我要重写的代码 protected string
  • 验证 asp.net mvc 中的下拉列表

    in controller ViewBag Categories categoryRepository GetAllCategories ToList in view Html DropDownList Cat new SelectList
  • AspNetUserLogins 表身份

    AspNetUserLogins 的用途是什么 是存储用户的登录信息吗 然后我如何用该数据更新该表 AspNetUserLogins 的用途是什么 在Asp net Identity中 Identity系统使用AspNetUserLogin
  • asp.net mvc - Ajax 刷新视图的每个元素

    希望在退出 jquery 对话框后使用 ajax 刷新当前页面 我有一个包含 foreach 循环的视图 数据是从模型中提取的 每个循环有 2 个编辑 删除按钮 当我单击 编辑按钮 时 将打开一个 jquery UI 对话框进行编辑 当我保
  • MVC3、Ninject、MvcSiteMapProvider - 如何将依赖项注入到重写方法

    我有一个正在使用的 MVC3 应用程序Ninject http ninject org and Mvc站点地图提供者 http mvcsitemap codeplex com 我创建了此类 MvcSiteMapProvider 使用它来动态
  • Ajax.BeginForm 无法与 Html.ValidationSummary 一起使用

    我正在尝试使用 Ajax BeginForm 将数据发布到控制器 如果出现特定错误 表单应重新呈现并显示添加到 ModelState 的自定义错误消息 由于某种原因 错误消息未显示 我什至正在尝试以下不起作用的测试用例 我是否遗漏了什么 E
  • ASP.Net Web API:在读取/上传请求正文之前发送响应

    我的控制器上有一个操作 应该上传大型 500mb 2gb 文件 例如 HttpPost public void PostFile FromUri Guid uploadId 在正文内部 执行一些检查 例如 uploadId 是否存在 然后将
  • 如何持久化传递给局部视图的数据模型?

    为了说明我面临的问题 我整理了三个简单的数据模型 public class PersonalModel public string FirstName get set public string LastName get set publi
  • MVC 6通过Nuget添加后引用Jquery

    我创建了一个新的 MVC 6 项目 空模板 通过 NuGet 添加了 JQuery 那么如何在 Layout 文件中或您想要使用它的任何地方引用它 我没有包含 Jquery 的脚本文件夹 HERE
  • MVVM ViewModel 与 MVC ViewModel

    ViewModel 是一个在 MVVM Model View ViewModel 和 ASP NET MVC 的推荐实现中使用的术语 鉴于每种模式都使用相同的术语 研究 ViewModel 可能会令人困惑 MVC ViewModel 和 M

随机推荐