[英]RedirectToAction usage in asp.net mvc
我想发布一些关于ASP.Net MVC
的问题。 我不熟悉网络开发,但我被分配到一个项目的网络部分。 我们正在执行以下操作:首先,我们为人员数据创建get
和set
属性:
public class Person
{
public int personID {get;set;}
public string personName {get;set;}
public string nric {get;set;}
}
登录后,我们将数据放入类Person
对象中,并像这样使用RedirectToAction
:
return RedirectToAction("profile","person",new { personID = Person.personID});
它工作正常,但参数显示在 URL 中。 如何隐藏它们以及隐藏动作名称? 请用一些例子指导我正确的方法。
该参数显示在 URL 中,因为这是RedirectToAction
的第三个参数 - 路由值。
默认路由是{controller}/{action}/{id}
所以这段代码:
return RedirectToAction("profile","person",new { personID = Person.personID});
将产生以下 URL/路由:
/人/简介/123
如果你想要一条更干净的路线,就像这样(例如):
/人/123
创建新路线:
routes.MapRoute("PersonCleanRoute",
"people/{id}",
new {controller = "Person", action = "Profile"});
并且您的 URL 应该像上面那样干净。
或者,您可能根本不喜欢使用 ID,您可以使用其他一些唯一标识符——比如昵称。
所以 URL 可能是这样的:
人/rpm1984
为此,只需更改您的路线:
routes.MapRoute("PersonCleanRoute",
"people/{nickname}",
new {controller = "Person", action = "Profile"});
以及您的操作方法:
public ActionResult Profile(string nickname)
{
}
以及您的 RedirectToAction 代码:
return RedirectToAction("profile","person",new { nickname = Person.nickname});
那是你的追求吗?
如果您不希望该参数显示在地址栏中,您需要将其保存在重定向之间服务器上的某个位置。 实现此目的的好地方是TempData
。 这是一个例子:
public ActionResult Index()
{
TempData["nickname"] = Person.nickname;
return RedirectToAction("profile", "person");
}
现在在 Profile 操作上,您要重定向以从TempData
获取它:
public ActionResult Profile()
{
var nickname = TempData["nickname"] as string;
if (nickname == null)
{
// nickname was not found in TempData.
// this usually means that the user directly
// navigated to /person/profile without passing
// through the other action which would store
// the nickname in TempData
throw new HttpException(404);
}
return View();
}
在幕后, TempData
使用Session
进行存储,但它会在重定向后自动退出,因此该值只能使用一次,这正是您需要的:存储、重定向、获取。
当刷新页面后 TempData 消失时,这可能是问题的解决方案:-
当你第一次在 action 方法中获取 TempData 时,将其设置在 ViewData 中并写入检查,如下所示:
public ActionResult Index()
{
TempData["nickname"] = Person.nickname;
return RedirectToAction("profile", "person");
}
现在进行配置文件操作:
public ActionResult Profile()
{
var nickname = TempData["nickname"] as string;
if(nickname !=null)
ViewData["nickname"]=nickname;
if (nickname == null && ViewData["nickname"]==null)
{
throw new HttpException(404);
}
else
{
if(nickname == null)
nickname=ViewData["nickname"];
}
return View();
}
临时数据能够处理单个后续请求。 因此,刷新页面后价值消失了。 为了缓解这个问题,我们也可以在这种情况下使用 Session 变量。 尝试以下:
public ActionResult Index(Person _person)
{
Session["personNickName"] = _person.nickName;
return RedirectToAction("profile", "person");
}
在“配置文件”操作方法中:
public ActionResult profile()
{
Person nickName=(Person)Session["personNickName"];
if(nickName !=null)
{
//Do the logic with the nickName
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.