2010-10-05 306 views
2

首先對不起我的英語不好,我是法國人。我會盡力讓我明白:)如何不通過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/ 

你能幫助我嗎?謝謝

回答

3

如果你不想在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

1

如果這是一部分,如果當前用戶的身份,某種類型的cookie似乎是正常的方法,但除非您的內容是加密簽名值或不透明的不可預知的查找(Guid)到一定的價值。在任何一種情況下,你也想讓它有時間限制來防止重放。

如果你只是不希望在URL上的數據POST可能會有所幫助,但你不能重定向到POST。

1

使用POST而不是GET並不能真正幫助解決您的問題,因爲任何人都可以像GET一樣輕鬆地僞造POST。

我建議你檢查服務器端,如果用戶有權限查看數據或沒有。

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

HTHS,
查爾斯