2010-03-16 68 views
2
public Edit(int? id){ /* Codes */ } 

[HttpPost] 
public Edit(Item model){ /* Codes */ } 

我在第一個Edit方法中檢索Item的副本,該副本包含ItemID的值。但是當它到達HttpPost方法時,id值就會丟失。ASP.NET MVC在編輯時保留mdoel的ID值

如果切換到

public Edit(int? ItemID){ /* Codes */ } 

[HttpPost] 
public Edit(Item model){ /* Codes */ } 

這樣的ItemID可以在項目模型被持久化。 但這是處理它的好方法嗎? ASP.NET MVC總是能夠知道它需要將「ItemID」插入到Item中嗎? 並且還有其他方法來保存ID值嗎?謝謝。

+0

請查看是否從提交的表單中的數據正確映射在第二編輯方法模型對象。 – 2010-03-17 00:00:37

回答

1

我不明白你如何在HttpPost處理中丟失id。也許你應該檢查你的粘結劑,並可能爲自己寫一個嗎?根據我的經驗,默認粘合劑有點麻煩。你可以從 here開始,但我並不假裝它是最好的解決方案。如果您需要手動編寫多個綁定程序,請查看一些工具,這些工具可以幫助您以聲明性方式進行轉換,如AutoMapper

1

您是否嘗試將該ID作爲參數添加到Post操作中?

public Edit(int? id){ /* Codes */ } 

[HttpPost] 
public Edit(int id, Item model){ /* Codes */ } 

這樣,當表單回傳時,ID將從URL填充。

+0

在這種情況下,Item模型參數有點奇怪。 – 2010-03-17 00:07:10

+0

沒有。這是獲得id的非常合法的方式。考慮到你已經有了一個帶有ID的URL,爲什麼不用ID回來呢? – 2010-03-17 00:57:08

+0

這就是我的做法。只要確保檢查ID的權限,因爲它可以很容易地更改 - 這適用於任何方法,它不是特定於此。 – Charlino 2010-03-17 03:30:11

0

Phil Haack有一個帖子,可能會或可能不會涉及到你在做什麼。另外,如果您不是將ID作爲表單的一部分(隱藏字段或whatnot)發送給客戶端,並且它不是POST URL的一部分,那麼它只會讓你感覺不到,在POST中正確填充ID字段。

1

您的Item模型屬性是ItemID?如果是這樣,那麼如果您在名爲ID的字段周圍傳遞,則默認模型聯編程序不會填充它。如果您更改方法簽名以使參數名稱與您的Item屬性名稱匹配,它應該按預期工作。

0

解決ID問題的MVC 2方式是Optional URL Parameters

如果你仍對MVC 1然後用綁定屬性的方法的參數:

[HttpPost] 
public ActionResult Edit([Bind(Exclude = "ItemID")] Item model) 
{ 
    // ... 
} 
0

小晚的答案,但使用剃刀時,其通常使用隱藏字段,以綁定ID,以該模型。

 @Html.HiddenFor(model => model.Id) 

一個完整的形式後看起來是這樣的:

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>Address</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     @Html.HiddenFor(model => model.Id) 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.StreetLine1, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.StreetLine1, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.StreetLine1, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Save" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
}