asp.net mvc中重定向操作的使用
我想发布一些关于ASP.Net MVC的问题。我不熟悉web开发,但我被分配到一个项目的web部件。我们正在执行以下操作:首先,我们为person数据创建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
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中看到它。但我对所有这一切都是新手。