我继承了一个MVC项目,如果调用的Action正确完成,则该页面应显示一条指示成功的消息。我遇到了一些麻烦,因为我一般对MVC和Web开发还很陌生。
在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中的值加载到一个变量中,然后进行测试以查看该变量是否包含任何内容(请注意:该同一个Action用于呈现页面,无论用户是否刚刚将其放置在此处,或者他们已经单击按钮以执行MyAction)。如果变量不为null,则将其包含的内容加载到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();
}
}
可能的线索:当通过从MyAction()重定向之外的其他方式调用MainWindow()方法时,我的日志指示actionResult为null,但是,通过从MyAction的重定向进行调用时(),actionResult是一个空字符串。这使我相信MyAction()正在用某物填充TempData,但是我看不到为什么它不包含我要分配的字符串。有人在这里看到抽烟的枪吗?
答案 0 :(得分:1)
此处使用的RedirectToAction
重载为:
protected internal RedirectToRouteResult RedirectToAction(string actionName, object routeValues);
以前的开发人员正在使用anonymous type创建路由值:
new { @SavedMessage = savedMessage }
代码正在重定向到名为Action
的{{1}},该参数带有一个名为MyView
的参数。
您的控制器中必须有另一个看起来或多或少像这样的方法:
SavedMessage
该方法实际上将设置消息并执行视图。
更新:
阅读提供的其他信息后,您应该改用public ActionResult MyView(string SavedMessage)
{
//Maybe some code here
ViewBag.SavedMessage = SavedMessage;
return View();
}
:
string.IsNullOrWhiteSpace
其他所有内容都应该可以正常工作,这意味着您可以在该部分执行之前在其他地方重定向其他代码:
@if (!string.IsNullOrWhiteSpace(savedMessage))
或者您正在检查的视图不是用于显示结果的视图。请注意,由于您正在重定向执行,因此使用的新视图文件将为ViewBag.SavedMessage = SavedMessage;
return View();
。
答案 1 :(得分:1)
[
{
"chatid": 10000414,
"connected": true,
"index": 0,
"jsonedUser": {},
"membership": "",
"messages":[
{ "chatid": 10000414, "createdOn": "2018-10-29T16:50:44.4900000", "isArchive": false, "isNew": false, "message": "great", "messageid": 3, "sentby": {"id":59, "name":"Omar"} },
{ "chatid": 10000414, "createdOn": "2018-10-25T13:49:50.9900000", "isArchive": false, "isNew": false, "message": "hi", "messageid": 2, "sentby": {"id":59, "name":"Omar"} },
{ "chatid": 10000414, "createdOn": "2018-10-31T10:20:59.5000000", "isArchive": false, "isNew": false, "message": "hello there", "messageid": 1, "sentby": {"id":91, "name":"Ana"} }
"new message" ->{chatid: 10000414, createdOn: "2018-10-29T16:50:44.4900000", isArchive: false, isNew: false, message: "asdasd", …}
],
"opened": true,
"port": 10842,
}
]
以上代码将使用 查询字符串中的消息 将用户引导至return RedirectToAction("CreateViewAction", new { @SavedMessage = savedMessage });
页面。问题是用户可以在URL中看到消息,这很丑陋。
在ASP.NET MVC中的页面之间传递数据的最简单方法是使用 TempData 。
CreateViewAction
答案 2 :(得分:0)
RedirectToAction方法正在控制器中调用另一个方法,并传入一个对象,该对象是该方法的路由值。
新的{...}创建一个匿名对象,因此不需要定义集合类型。
我的猜测是,该控制器中还有另一种方法可以重新创建视图,并且应该将接收到的参数分配给ViewBag