2014-08-28 96 views
0

我需要幫助來理解這件事。C#MVC 4/5 - Id存儲在哪裏?

可以說我有這樣的

[HttpGet] 
    public ActionResult Edit(int id) 
    { 
     var model = new Model(); 
     return View(model); 
    } 

一個動作,這樣

[HttpPost] 
    public ActionResult Edit(Model model, int id) 
    { 

    } 

問題的行動:

當我做一個GET請求(例如http://url.com/controller/Edit/2

然後操作方法的id將有值2,我們將請參閱編輯視圖。

現在,當我更改URL中的Id(例如http://url.com/controller/Edit/4) 並對另一個ActionMethod進行提交(POST)時,該ID仍然具有值2(而不是4!我預期爲)

這是爲什麼?誰可以給我解釋一下這個?

謝謝!

+1

在模型中,你有id字段嗎?如果是的話,你還需要設置它的值 – 2014-08-28 06:17:02

+2

請顯示你的看法。在'POST'請求中,動作參數是從'FORM'值綁定的。可能某些表單輸入(具有'id' name)值爲2 - 可能是在'GET'操作中設置的。 – 2014-08-28 06:17:26

+0

它可能在表單中隱藏的輸入內 - 它隱藏,因爲您不希望人們在編輯模型時更改ID(鍵)。如果你想公開它,你可以使用EditorFor(m => m.id)。儘管在上面的GET中,你只是返回一個通用視圖,雖然不是你,而不是特定於傳入ID的東西嗎? – LDJ 2014-08-28 06:21:49

回答

0

ASP.NET MVC使用值提供商順序如下:

  1. 以前綁定的動作參數,當動作是一個孩子的動作
  2. 表單域
  3. 在JSON請求體的屬性值(對於AJAX請求)
  4. 路線數據
  5. 查詢字符串參數
  6. 發佈文件

因此,當模型聯編程序試圖找到參數id的值時,它首先在請求中查找表單數據。因此,你是路過Model擁有財產與名id形式的數據看起來就像是:

id=2&name=foo 

所以成功找到匹配的表單數據名爲id參數,並不會進一步去分析路由數據或查詢字符串。

如果您要修改在您的請求中傳遞的表單數據並刪除id=2部分,則來自查詢字符串的id參數將用於action的model和id參數。

不能使用自動綁定在這裏,但你總是可以手動獲得查詢字符串參數(雖然我覺得這種做法非常混亂 - 更好的方法將使用不同的名稱id參數):

string id = Request.QueryString.Get("id"); 

推薦閱讀:The Features and Foibles of ASP.NET MVC Model Binding