我这样做了。
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
任何帮助将不胜感激。
答案 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
}