2013-06-23 31 views
0

因此,這裏是我的情況我有一個模型:MVC 4 EF 5 ID字段改變值綁定

public class Label 
{ 
    [Key] 
    [MaxLength(20, ErrorMessageResourceType = typeof(Validation), ErrorMessageResourceName = "MaxLength")] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public string ID { get; set; } 

    public string en { get; set; } 

    public string fr { get; set; } 

    public string es { get; set; } 

    public string ar { get; set; } 
} 

的CONTROLER動作的樣子:

public ActionResult Edit(int id = 0) 
    { 
     Criteria criteria = db.Criteria.Find(id); 
     if (criteria == null) 
     { 
      return HttpNotFound(); 
     } 

     Label label = dbl.Labels.Where(l => l.ID == criteria.Label).FirstOrDefault(); 

     return View(label); 
    } 

和崗位:

[HttpPost] 
    public ActionResult Edit(Label label) 
    { 
     if (ModelState.IsValid) 
     { 

      Label L = dbl.Labels.Find(label.ID); 
      L.en = label.en; 

      dbl.SaveChanges(); 

     } 

     return View(label); 
    } 

以及看起來像這樣的視圖:

@model RAPID.Models.Translation.Label 

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 

<fieldset> 
    <legend>Criteria</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.ID) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.ID) 
     @Html.ValidationMessageFor(model => model.ID) 
    </div> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.en) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.en) 
     @Html.ValidationMessageFor(model => model.en) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.es) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.es) 
     @Html.ValidationMessageFor(model => model.es) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.fr) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.fr) 
     @Html.ValidationMessageFor(model => model.fr) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.ar) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.ar) 
     @Html.ValidationMessageFor(model => model.ar) 
    </div> 
    <p> 
     <input type="submit" value="Save" /> 
    </p> 
</fieldset> 

}

我遇到的問題是,由於某種原因,當我檢查的編輯label.ID(獲得)的值是關聯到該域的正確字符串值。現在,當我在帖子中檢查相同的值label.ID時,此值已更改爲整數值,該值似乎與表中記錄的順序相對應。同樣在編輯視圖中,顯示的值是數字值與正確的字符串值。所以我認爲它與模型綁定有關,但不知道如何解決它。

想知道是否有人知道問題可能是什麼。

由於提前

回答

0

我想這是因爲你用id的編輯頁面,然後你做了後,它從URL(routevalue)的ID將覆蓋你的字符串ID。不確定。您的代碼是有點亂這裏有些事情:

Label label = dbl.Labels.Where(l => l.ID == criteria.Label).FirstOrDefault(); 

替換:

Label label = dbl.Labels.FirstOrDefault(l => l.ID == criteria.Label); 


criteria.Label是一個字符串我想還是項目?你應該把它命名爲LabelID。因爲它令人困惑^^。 我認爲你可以通過將標籤類中的ID重命名爲LabelID之類的東西來解決所有這些問題。然後系統不會與2個ID相混淆。

+0

呀criteria.Label是一個字符串...更改ID,以LabelID將需要許多其他現在改變到應用程序的其他部分,但我同意它應該改變,並可以解決問題。我不明白你指出的第一項內容的差異,並認爲它的偏好 – user2129585

+0

以及第二個更短,我認爲SQL linq足夠聰明,性能不會更快但仍然。編寫什麼都不做的代碼有點不好。你也可以嘗試改變HttpGet參數,從(int id = 0)到(int labelid = 0)。這些變化不需要很多工作。 – Maximc

+0

我同意較短的代碼,並將使用您的建議前進:) ...好吧,所以我改變了Get方法從int id = 0到字符串id這種方式,我只是直接傳遞標籤字符串,而不是再次查找它但你的建議也適用於將輸入參數的名稱更改爲ID以外的內容...我想說到綁定URL時優先於其他所有內容......非常感謝您的幫助 – user2129585

0

或者你可以創建模型的訪問,如公共字符串LabelID { get{return ID}; set{ID = value}; }並利用它來進行間接修改ID =)