如何不通过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请求访问它。
答
如果这是一部分,如果当前用户的身份,某种类型的cookie似乎是正常的方法,但除非您的内容是加密签名值或不透明的不可预知的查找(Guid)到一定的价值。在任何一种情况下,你也想让它有时间限制来防止重放。
如果你只是不希望在URL上的数据POST可能会有所帮助,但你不能重定向到POST。
答
使用POST而不是GET并不能真正帮助解决您的问题,因为任何人都可以像GET一样轻松地伪造POST。
我建议你检查服务器端,如果用户有权限查看数据或没有。
你到底想要做什么?你可以使用HMAC。
HTHS,
查尔斯
我想过,但是当我使用FormMethod.Post,我的参数不在[HttpPost]在我的控制器通过。 – Akawan 2010-10-07 08:29:42
当您使用FormMethod.Post时,表单集合中的所有表单值都将在请求中传递(而不是URL作为查询字符串)。然后在服务器模型绑定中将这些值映射到您的操作参数。 – 2010-10-07 08:56:11