asp.net mvc中的RedirectToAction用法

Cho*_*ong 30 asp.net asp.net-mvc

我想发一些问题ASP.Net MVC.我不熟悉Web开发,但我被分配到项目的Web部分.我们正在执行以下操作:首先,我们为人员数据创建get&set属性:

public class Person
{
    public int personID {get;set;}
    public string personName {get;set;}
    public string nric {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

登录后,我们将数据放在一个类Person对象中,我们使用RedirectToAction如下:

return RedirectToAction("profile","person",new { personID = Person.personID});
Run Code Online (Sandbox Code Playgroud)

它正常工作,但参数显示在URL中.我怎样才能隐藏它们?我还可以隐藏动作名称吗?请通过一些例子以正确的方式指导我.

RPM*_*984 42

该参数显示在URL中,因为这是第三个参数RedirectToAction- 路由值.

默认路由是 {controller}/{action}/{id}

所以这段代码:

return RedirectToAction("profile","person",new { personID = Person.personID});
Run Code Online (Sandbox Code Playgroud)

将产生以下URL /路由:

/人/资料/ 123

如果你想要一个更干净的路线,比如这样(例如):

/人/ 123

创建一个新路线:

routes.MapRoute("PersonCleanRoute",
                "people/{id}",
                new {controller = "Person", action = "Profile"});
Run Code Online (Sandbox Code Playgroud)

并且您的网址应该是干净的,如上所述.

或者,你可能不喜欢在所有使用的ID,你可以使用一些其他的唯一标识符 - 就像一个昵称.

所以URL可以是这样的:

人/ rpm1984

要做到这一点,只需改变你的路线:

routes.MapRoute("PersonCleanRoute",
                    "people/{nickname}",
                    new {controller = "Person", action = "Profile"});
Run Code Online (Sandbox Code Playgroud)

你的行动方法:

public ActionResult Profile(string nickname)
{

}
Run Code Online (Sandbox Code Playgroud)

和你的RedirectToAction代码:

return RedirectToAction("profile","person",new { nickname = Person.nickname});
Run Code Online (Sandbox Code Playgroud)

那是你的追求吗?


Dar*_*rov 9

如果您不希望参数显示在地址栏中,则需要在重定向之间将其保留在服务器上的某个位置.实现这一目标的好地方是TempData.这是一个例子:

public ActionResult Index()
{
    TempData["nickname"] = Person.nickname;
    return RedirectToAction("profile", "person");
}
Run Code Online (Sandbox Code Playgroud)

现在,在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();
}
Run Code Online (Sandbox Code Playgroud)

在幕后TempData使用Session的存储,但它会重定向后会自动驱逐,因此该值可能只能使用一次是你需要的东西:商店,重定向,取.