使用TempData

时间:2018-11-02 14:48:52

标签: c# asp.net-mvc

我继承了一个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,但是我看不到为什么它不包含我要分配的字符串。有人在这里看到抽烟的枪吗?

3 个答案:

答案 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中看到消息,这很丑陋。

enter image description here

在ASP.NET MVC中的页面之间传递数据的最简单方法是使用 TempData

CreateViewAction

答案 2 :(得分:0)

RedirectToAction方法正在控制器中调用另一个方法,并传入一个对象,该对象是该方法的路由值。

新的{...}创建一个匿名对象,因此不需要定义集合类型。

我的猜测是,该控制器中还有另一种方法可以重新创建视图,并且应该将接收到的参数分配给ViewBag