首页 > 解决方案 > 如何使用模型刷新视图

问题描述

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

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

这是代码CopyFrom ActionResult

        [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 并传递模型。.

标签: c#asp.net-mvcurlquery-string

解决方案


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

所以例如

CopyFrom?firstParam=1&val=15551

两个参数发送到服务器的有效方式。

在您的情况下,您只有一个参数,因此您希望最终得到

CopyFrom?val=15551

只需要更改代码

"this.href += '&val='

"this.href += '?val='

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

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


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


推荐阅读