如何使用模型刷新视图



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

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

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

例如

CopyFrom?firstParam=1&val=15551

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

在你的情况下,你只有一个参数,所以你希望最终使用

CopyFrom?val=15551

这只需要更改代码

"this.href += '&val='

"this.href += '?val='

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

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


p.S.你不应该真的从操作方法返回null-处理这一问题的正确方法是返回视图,但显示错误消息-要么通过模型状态错误,要么只是ViewBag中的一些自定义内容,甚至重定向到通用错误页面(如果问题无法恢复)。你应该已经能够在网上找到很多这样的例子了。但你应该总是向浏览器返回东西——毕竟,你听说过如果你犯了一个微不足道的错误,网页就会变成一片空白,没有任何解释吗?

最新更新