【问题标题】:RedirectToAction usage in asp.net mvcasp.net mvc 中的 RedirectToAction 用法
【发布时间】:2010-12-06 02:45:02
【问题描述】:

我想发布一些关于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 中看到该参数,您应该将其发布在 FORM 中。然后您仍然可以在 FormCollection 中访问它,但人们不会在 URL 中看到它。但我对这一切也很陌生。

标签: asp.net asp.net-mvc


【解决方案1】:

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

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

所以这段代码:

return RedirectToAction("profile","person",new { personID = Person.personID});

将产生以下 URL/路由:

/Person/Profile/123

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

/people/123

创建一条新路线:

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

你的网址应该是干净的,就像上面一样。

或者,您可能根本不喜欢使用 ID,您可以使用其他一些唯一标识符 - 例如昵称。

所以 URL 可能是这样的:

people/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});

这就是你的追求吗?

【讨论】:

  • 所以,没有办法隐藏参数?实际上我们不想在url处显示任何参数。 :(
  • @Chong - 当然你可以隐藏参数,它只取决于 URL。那你想要什么网址呢?给我一个示例网址。
  • 如果您不想要任何参数,只需执行 return RedirectToAction("profile","person"); 但这会产生 /person/profile,这作为 URL 没有任何意义 - 这就是为什么我要求您给我您想要的 URL 示例。
  • 感谢您的回复朋友,我想显示这样的“Person/Profile”不带参数。我的意思是我会传递参数,但是,不想在 URL 上显示。问候冲
  • 如何传递参数而不显示在 URL 中?你要在哪里传递参数?我想你会感到困惑。这不是代码中的方法 - 这是 HTTP,有参数和表单 post 值。
【解决方案2】:

如果您不希望参数显示在地址栏中,则需要在重定向之间将其保存在服务器上的某个位置。实现这一目标的好地方是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 进行存储,但它会在重定向后被自动驱逐,因此该值只能使用一次,这就是您需要的:存储、重定向、获取。

【讨论】:

  • 不错,可以用这个。但是您真的想在单个重定向上进行序列化/反序列化(假设非 In proc 会话)吗?如果他使用表单身份验证,他无论如何都可以从票证中获取用户信息。
  • 感谢您的所有回复,我的问题是刷新页面后 TempData 消失了,出现错误。我该如何处理?
  • 如果您使用“Peek”方法读取“TempData”,它将持续到下一个请求。 stringstr = TempData.Peek("Td").ToString();有关更多 TempData 详细信息,请参阅以下文章:codeproject.com/Articles/818493/…
【解决方案3】:

这可能是刷新页面后 TempData 消失的问题的解决方案:-

当您第一次在操作方法中获取 TempData 时,将其设置为 ViewData & write check,如下所示:

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

现在是 Profile 动作:

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();
}

【讨论】:

    【解决方案4】:

    临时数据能够处理单个后续请求。因此,刷新页面后价值消失了。为了缓解这个问题,我们也可以在这种情况下使用 Session 变量。试试下面:

    public ActionResult Index(Person _person)
    {
        Session["personNickName"] = _person.nickName;
        return RedirectToAction("profile", "person");
    }
    

    并且在“profile”动作方法中:

    public ActionResult profile()
    {
        Person nickName=(Person)Session["personNickName"];
        if(nickName !=null)
        {
        //Do the logic with the nickName
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-11-16
      • 2019-07-09
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多