繁体   English   中英

RedirectToAction 在 asp.net mvc 中的用法

[英]RedirectToAction usage in asp.net mvc

我想发布一些关于ASP.Net MVC的问题。 我不熟悉网络开发,但我被分配到一个项目的网络部分。 我们正在执行以下操作:首先,我们为人员数据创建getset属性:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM