如何使用RedirectToAction将对象作为隐藏参数传递?

时间:2014-08-27 07:44:04

标签: asp.net-mvc

我这样做了。

public ActionResult GetInfo(SomeModel entity)
{
     ----
     return RedirectToAction("NewAction", "NewController", new System.Web.Routing.RouteValueDictionary(entity));
}

被称为

的行动
public ActionResult NewAction(SomeModel smodel)
{
     -------
     -------
}

这工作正常,但我可以在浏览器地址栏上看到所有发布的参数值,如何在浏览器中隐藏这些查询字符串参数值。

http://localhost:51545/NewController/NewAction?SurveyID=13&CatID=1&PrimaryLang=1&SurveryName=Test%20Survery&EnableMultiLang=False&IsActive=False

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:11)

在你的情况下,而不是使用RouteValueDictionary并从querystring传递模型try TempData(因为当我们使用RedirectToAction时,它将生成一个新的http请求,对象路由将显示在url中,因此它不是在url中显示敏感数据的好方法。

如下所示使用TempData: -

public ActionResult GetInfo(SomeModel entity)
{
  ----
  TempData["entity"] = entity; //put it inside TempData here
  return RedirectToAction("NewAction", "NewController");
}

public ActionResult NewAction()
{
   SomeModel smodel = new SomeModel();
   if(TempData["entity"] != null){
   smodel = (SomeModel)TempData["entity"];  //retrieve TempData values here
   }
   -------
   -------
}

这里使用TempData的好处是它将保留一个重定向的值,而且模型将私有传输到另一个控制器操作,一旦您从TempData读取数据,其数据将被处置自动如果您想在阅读后保留TempData值,请使用TempData.keep("entity")


OR

如果您的视图位于同一个控制器中,那么这是解决您问题的简单方法:

public ActionResult GetInfo(SomeModel entity)
{
  ----
  return NewAction(entity);
}

public ActionResult NewAction(SomeModel smodel)
{
   -------
   -------
  return View("NewAction",smodel)
}

正如@ Chips_100正确评论所以我在这里包含它: - 第一个解决方案将进行真正的重定向(302),它将更新用户浏览器中的URL。第二个解决方案将提供所需的结果,同时将原始URL保留在地址栏中。

答案 1 :(得分:0)

从您的问题开始,隐藏参数的范围限定为用户会话。

因此,您可以将其存储到控制器的Session属性中:

public ActionResult GetInfo(SomeModel entity)
{
     Session["SomeKey"] = "SomeValue";
     return RedirectToAction("NewAction", "NewController");
}

之后你可以检索它(另一个控制器也可以在这里工作):

public ActionResult NewAction(SomeModel smodel)
{
     var parameter = Session["SomeKey"] as string;

     // Remove the parameter from session storage
     Session.Remove("SomeKey");

     // Do the stuff using provided parameter value

}