如何不通过URL传递参数?

问题描述:

首先对不起我的英语不好,我是法国人。我会尽力让我明白:)如何不通过URL传递参数?

我想从视图传递参数到控制器没有使用该网址。

参数是一个用户标识符,我不希望有人在url中手动更改它。


我的视图代码:

<% foreach (var item in ViewData["ClientsList"] as List<SalesCoverseal_V2.Models.Customer>) 
      { %> 
     <tr> 
      <td> 
       <%: Html.ActionLink("Editer", "ClientEdit", new { id=item.PersonId }) %> 

      <%: Html.ActionLink("Faire une offre", "Index", new { controller 
= "Offer", id=item.PersonId }) %> 

在控制器:

public ActionResult Index(string id) 
     { 
      if (currentLoginUser != null) 
      {     
       CurrentCustomer = WebService.GetClientInfos(id); 
       SessionManager.CurrentCustomer = CurrentCustomer; 

       OfferViewModel viewmodel = new OfferViewModel(); 

       return View(viewmodel); 

      } 


My url : 

> http://localhost:50905/Offer/Index/WS00000401 

But I don't want this url, I want 

> http://localhost:50905/Offer/ 

你能帮助我吗?谢谢

如果你不想在URL中传递id,你将不得不'发布'请求,即提交表单。
你可以通过将id放在隐藏字段中来实现。你应该知道,这本身并不是防篡改的。
如果您想确保您的用户标识没有被篡改,那么在发送给客户端之前,您必须对其进行加密,然后在返回时解密,以便您可以检查它是否存在以任何方式被改变。 此外,您可以将您的Action方法标记为只接受Post请求,以防止任何人尝试使用Get请求访问它。

+0

我想过,但是当我使用FormMethod.Post,我的参数不在[HttpPost]在我的控制器通过。 – Akawan 2010-10-07 08:29:42

+0

当您使用FormMethod.Post时,表单集合中的所有表单值都将在请求中传递(而不是URL作为查询字符串)。然后在服务器模型绑定中将这些值映射到您的操作参数。 – 2010-10-07 08:56:11

如果这是一部分,如果当前用户的身份,某种类型的cookie似乎是正常的方法,但除非您的内容是加密签名值或不透明的不可预知的查找(Guid)到一定的价值。在任何一种情况下,你也想让它有时间限制来防止重放。

如果你只是不希望在URL上的数据POST可能会有所帮助,但你不能重定向到POST。

使用POST而不是GET并不能真正帮助解决您的问题,因为任何人都可以像GET一样轻松地伪造POST。

我建议你检查服务器端,如果用户有权限查看数据或没有。

你到底想要做什么?你可以使用HMAC

HTHS,
查尔斯