【发布时间】:2019-04-12 02:48:30
【问题描述】:
我继承了一个 MVC 项目,但我遇到了一些麻烦,因为我对 MVC 和 Web 开发非常陌生。
该项目包含一个生成视图的控制器操作方法。此方法可以在用户直接通过 UI 访问视图时调用,也可以在用户单击视图上的按钮执行操作后重新生成视图。如果执行操作后重新生成视图,则需要在页面上显示验证消息。
在 cshtml 文件中,我们在 MainWindow.cshtml 中有以下内容,它仅在 ViewBag 中存在名为“SavedMessage”的字符串且不为 null 或空的情况下以条件渲染表格:
@{ string actionResult = ViewBag.SavedMessage; }
@if (!string.IsNullOrEmpty(actionResult))
{
<tr>
<td>
@actionResult
</td>
</tr>
}
在 Action 方法中,我尝试使用 TempData 对象将字符串值传输到生成视图的 Action:
public partial class ApproveController : Controller
{
const string IDX_ACTIONRESULT = @"ActionResult";
public ActionResult MyAction(FormCollection collection)
{
try
{
string result_success = @"Action completed successfully";
//Do stuff
TempData[IDX_ACTIONRESULT] = result_success;
return RedirectToAction("MainWindow");
}
catch (Exception e)
{
Logger.reportException(e);
throw e;
}
}
}
在生成视图的Action中,我们将存储在TempData中的值加载到一个变量中,然后测试该变量是否包含任何内容。如果变量不为空,我会尝试将它包含的任何内容加载到 ViewBag 中。
创建视图操作:
public partial class ApproveController : Controller
{
public ActionResult MainWindow()
{
//Do Stuff
var actionResult = TempData[IDX_ACTIONRESULT];
if (actionResult != null)
{
Log.info("Action Result Message: " + actionResult);
ViewBag.SavedMessage = actionResult;
}
else
Log.info("Action Result Message is NULL");
return View();
}
}
可能的线索: 当 MainWindow() 方法是通过 UI 而不是 MyAction() 的 Redirect 调用时,我的日志显示 actionResult 为 null,但是,当它通过 MyAction() 的 Redirect 调用时,actionResult 是一个 空字符串。这让我相信 MyAction() 正在用 something 填充 TempData,但我不明白为什么它不包含我在 MyAction() 中分配的字符串。
有人在这里看到确凿证据吗?
【问题讨论】:
-
有什么问题?您预计会发生什么以及会发生什么?
-
@Jasen - 我需要在 MyAction() 中添加到 TempData 的字符串在 MyAction() 重定向到 MainWindow() 时保留,以便我可以将其添加到 ViewBag。
-
我不知道这是否是一个错字,但在您看来,您检查的是
savedMessage而不是actionResult。有没有调试过控制器,确认TempData[IDX_ACTIONRESULT]确实是一个空字符串? -
@Jasen - 谢谢你的收获;我已经解决了这个问题。这是在混淆我的代码时引入的一个错字;真实的代码是准确的。至于你的第二个问题,当我们从 MyAction 重定向时,我相当确定 TempData[IDX_ACTIONRESULT] 是一个空字符串。当我们从 UI 生成视图时,TempData[IDX_ACTIONRESULT] 肯定是 NULL。
标签: c# .net asp.net-mvc