Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
asp.net mvc中重定向操作的使用_Asp.net_Asp.net Mvc - Fatal编程技术网

asp.net mvc中重定向操作的使用

asp.net mvc中重定向操作的使用,asp.net,asp.net-mvc,Asp.net,Asp.net Mvc,我想发布一些关于ASP.Net MVC的问题。我不熟悉web开发,但我被分配到一个项目的web部件。我们正在执行以下操作:首先,我们为person数据创建get和set属性: public class Person { public int personID {get;set;} public string personName {get;set;} public string nric {get;set;} } 登录后,我们将数据放入类Person对象中,并使用Red

我想发布一些关于ASP.Net MVC的问题。我不熟悉web开发,但我被分配到一个项目的web部件。我们正在执行以下操作:首先,我们为person数据创建
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中,因为
重定向到操作的第三个参数是路由值

默认路由是
{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"});
您的URL应该是干净的,如上面所示

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

所以URL可以是这样的:

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

为此,只需更改路线:

routes.MapRoute("PersonCleanRoute",
                    "people/{nickname}",
                    new {controller = "Person", action = "Profile"});
以及你的行动方法:

public ActionResult Profile(string nickname)
{

}
以及您的重定向操作代码:

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

这就是您的目标吗?

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

public ActionResult Index()
{
    TempData["nickname"] = Person.nickname;
    return RedirectToAction("profile", "person");
}
现在,在配置文件操作中,您将重定向以从
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消失时的问题解决方案:-

第一次获取TempData in action方法时,请在ViewData和write检查中设置它,如下所示:

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
    }
}

所以,没有办法隐藏参数?实际上,我们不想在url处显示任何参数:(@Chong-当然你可以隐藏参数,这取决于URL。那么你想要什么URL?给我一个示例URL。如果你不想要任何参数,只需执行
返回重定向操作(“profile”,“person”)
但这将产生
/person/profile
,作为一个URL,它没有真正的意义-这就是为什么我要求你给我一个你想要的URL的例子。谢谢你的回复朋友,我想这样显示“person/profile”没有参数。我的意思是我会传递参数,但是,不想在URL上显示。你怎么能传递参数而不在URL中显示?你要在哪里传递参数?我想你会感到困惑。这不是代码中的方法-这是HTTP,有参数和表单post值。是的,可以使用这个。但是你真的想要吗要在单个重定向上序列化/反序列化(假设非进程会话)?如果他使用forms auth,他仍然可以从票据中获取用户信息。感谢您的所有回复,我的问题是刷新页面后TempData消失,我出现错误。我如何处理此问题?如果您使用“Peek”阅读“TempData”方法,它将为下一个请求保留。stringstr=TempData.Peek(“Td”).ToString();有关TempData的更多详细信息,请参阅以下文章:我认为如果您不想在URL中看到该参数,则应将其发布到表单中。然后您仍然可以在FormCollection中访问该参数,但人们不会在URL中看到它。但我对所有这一切都是新手。