【问题标题】:MVC action returning just viewbag resultMVC 动作仅返回 viewbag 结果
【发布时间】:2021-04-22 23:52:54
【问题描述】:

我是 MVC 5 的新手。

我在 MyController 目录中有一个名为 MyPage.cshtml 的页面。在该页面上,我有一个链接,定义为....

@Html.ActionLink("Get Info", "GetInfo", "MyController", new { myId = 1 }, null)

所以,在 MyController 控制器中,我有一个 GetInfo 方法。我只是想让它做一些事情,填写 ViewBag 结果然后返回到它所在的同一页面,即 MyPage。但我得到一个“对象引用未设置为对象的实例”。页面加载时出错。我正在考虑重定向到 MyPage 它的模型丢失了。这是我的代码....

public ActionResult GetInfo(int myId){
  // do stuff
  ViewBag.Result = "this is a test";
  return this.View("MyPage");
}

所以,为了简化事情:我实际上只处理一个页面,MyPage。链接点击只是调用一个自定义方法来做一些事情,我希望它回到原来的位置。请问有什么建议吗?

【问题讨论】:

  • 我在您的代码中没有看到任何关于重定向的内容。你错过了那个和你的控制器/视图代码,你得到了 null ref 异常。
  • 返回调用页面@mxmissile 的正确方法是什么?
  • 来自您的控制器? return RedirectToAction(...)。返回 View("MyPage") 不会重定向,只是将视图用于当前控制器操作。
  • 但如果我这样做,我的 ViewBag.Result 会丢失对吗?我想要做的只是调用一个动作来做一些事情并留在页面上。此外,显示 ViewBag.Result 中的内容。 @mxmissile
  • 你是对的,因为你想在你的行动中使用TempData["Result"] = "this is a test" ,然后在你的视图“MyPage”中使用@TempDate["Result"]来效仿你的榜样。

标签: asp.net asp.net-mvc-5


【解决方案1】:

您收到此错误

对象引用未设置为对象的实例。

因为您的视图 MyPage 取决于您未发送它的模型。

有不同的方法来处理您的第二个问题:

如果您想在执行GetInfo 操作后显示MyPage,您将要使用TempData[""]

public ActionResult GetInfo(int myId)
{
  // do stuff
  TempData["Result"] = "this is a test";
  return RedirectToAction("MyPage");
}

然后在您的MyPage 视图中:

@TempData["Result"]

另一个(不太理想的)选项是填充 MyPage 的模型并像原来一样返回它,这不会执行“重定向”:

public ActionResult GetInfo(int myId){
  // do stuff
  ViewBag.Result = "this is a test";

  var model = // ... populate model like (or from) MyPage

  return View("MyPage", model);
}

【讨论】:

  • 谢谢。有什么方法可以将模型传递给 GetInfo 操作,所以我不需要重新计算它? @mxmissile
  • 您必须将其序列化为查询字符串值,或发布包含数据的表单。如果您只是想执行后台操作,因此用户永远不会离开 MyPage,您可以对 GetInfo 进行后台调用,然后相应地更新视图。您必须在 javascript 中执行此操作。
  • @WebDevGuy2 如果您担心 DRY,您还可以重构将模型填充到方法中的代码,并从 MyPage() 和 GetInto() 调用相同的方法。
猜你喜欢
  • 2016-12-04
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
相关资源
最近更新 更多