【问题标题】:How to Refresh View with Model如何用模型刷新视图
【发布时间】:2019-06-16 04:09:59
【问题描述】:

我有一个包含用户需要填写的字段的表单。其中一部分有一个文本框,用户可以在其中输入参考编号,然后单击下面的链接以刷新视图,其中大部分字段都已填写。

@Html.ActionLink("Copy", "CopyFrom", "Logistics", "",new { onclick = "this.href += '&val=' + document.getElementById('ExistingRefNumber').value;" })

这是CopyFromActionResult的代码

        [HttpGet]
        public ActionResult CopyFrom(string val)
        {
            int id;
            if (int.TryParse(val, out id))
            {
                var fromModel = new LogisticsModels();
                fromModel = fromModel.GetLogisticsObject(id);

                if (fromModel != null)
                {
                    model = new LogisticsModels();
                    model = fromModel;
                    return View("Index", model);
                }
            }
            return null;
        }

这一切都很好,但我注意到地址栏中的 URL 已从

Views/Logistics/Index

Views/Logistics/CopyFrom&val=15551

所以当用户点击提交按钮时,会出现错误,因为它找不到 CopyFrom 视图。

我需要做什么才能让它再次工作?

编辑 1 我得到了上面的工作。我遇到的第二个问题是我的表单有一个提交按钮,它应该调用 Index(LogisticsModel 模型),但它却试图寻找 Logistics/CopyFrom。此问题仅在用户单击复制链接时发生,如上所示。我不确定如何显式调用 Index ActionResult 并传递模型。 .

【问题讨论】:

  • 我尝试修改它,但整个过程停止工作。本质上,我只是希望它保持在同一页面上,只需填写我在 Controller 中创建的模型中的值

标签: c# asp.net-mvc url query-string


【解决方案1】:

我认为问题是 CopyFrom&val=15551 - & 应该是 ?。在 HTTP URL 查询字符串中,? 表示查询字符串的开头,然后是第一个参数及其值。然后使用& 将后续参数与之前的参数分开,但& 对开始查询字符串无效。

例如

CopyFrom?firstParam=1&val=15551

将是向服务器发送两个参数的有效方式。

在您的情况下,您只有一个参数,因此您希望以

结尾
CopyFrom?val=15551

只需要修改代码

"this.href += '&val='

"this.href += '?val='

你应该没事的。 (注意,URL 仍将更改为 CopyFrom,但“索引”视图代码将用于呈现响应,这非常好。)

如果您调试服务器端代码,您会发现错误的结果是 C# 中的 val 始终为 null,因为 .NET 无法正确地从查询字符串中读取参数(因为,正如我解释,查询字符串无效)。这将反过来导致您的 TryParse 失败,因此操作方法将返回 null 而不是“索引”视图。


附:您真的不应该从操作方法返回 null - 处理此问题的正确方法是返回视图但显示错误消息 - 通过模型状态错误,或者只是 ViewBag 中的一些自定义内容,甚至重定向到一般错误页面(如果问题不可恢复)。您应该已经能够在网上找到大量此类事情的示例。但是您应该始终向浏览器返回 something - 毕竟,您是否听说过如果您犯了一个小错误,网页就会变成空白而没有任何解释?

【讨论】:

  • 我让它工作了。但是当用户点击提交按钮时,调用正在寻找 CopyFrom 而不是 Index as a View 这没有帮助。
  • 嗨。我不确定你指的是什么按钮,因为我在你的代码中看不到任何提交按钮......但我想它可能是你索引视图的一部分?无论如何,假设提交按钮在表单中,您可以轻松地将表单定义为回发到特定操作,而不是让它未定义(因此默认为当前 URL 恰好是)。换句话说,如果无论当前 URL 是 Index 还是 CopyFrom,它总是需要发布到 Index 操作,那么当您在 HTML 或 Razor 中定义表单时,您可以明确告诉它这样做
  • 我很抱歉缺少信息。有一个提交按钮应该调用索引(FormCollection 集合)。相反,它试图寻找 Logistics/CopyFrom 这显然是错误的。我将更新问题以显示更多信息。感谢您的帮助。
  • 在您的帮助下,我确实想通了。非常感谢
猜你喜欢
  • 2021-07-16
  • 1970-01-01
  • 2021-06-01
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多