2014-03-19 54 views
0

更新項目時遇到問題。當創建新項目時,CreatedAt值將填入當前時間&日期。當我編輯一個項目時,CreatedAt值立即被設置爲null。 UpdatedAt值被正確設置,但是CreatedAt在數據庫中被設置爲空。創建時,字段在更新項目時變爲空值

這裏的ItemViewModel類:

public class ItemViewModel 
{ 
    public int ItemId { get; set; } 
    public string ItemName { get; set; } 
    public int UserId { get; set; } 
    public string CreatedBy { get; set; } 
    public DateTime? CreatedAt { get; set; } 
    public string UpdatedBy { get; set; } 
    public DateTime? UpdatedAt { get; set; } 

    public virtual User User { get; set; } 
} 

這是更新的方法我用:

public void UpdateItem(ItemViewModel viewModel) 
{ 
    item.UpdatedBy = WebSecurity.CurrentUserName; 
    item.UpdatedAt = DateTime.Now; 
    db.SaveChanges(); 
} 

下創建方法填充CreatedAt值正常:

public int CreateItem(ItemViewModel viewModel) 
{ 
    var item = new Item(); 
    viewModel.CopyToItem(item); 

    item.UserId = WebSecurity.CurrentUserId; 
    item.CreatedBy = WebSecurity.CurrentUserName; 
    item.CreatedAt = DateTime.Now; 

    db.Items.Add(item); 
    db.SaveChanges(); 
    return item.ItemId; 
} 

有什麼我錯過了嗎?

+0

安置自己的操作方法。我認爲它與模型綁定有關。 –

回答

1

您應該檢查將修改條目或不使用EntityState爲:

public void UpdateItem(ItemViewModel viewModel) 
{ 
    var item=db.Table.where(x=>x.ID==viewModel.ID).FirstOrDefault(); 
    item.UpdatedBy = WebSecurity.CurrentUserName; 
    item.UpdatedAt = DateTime.Now; 
    db.Entry(item).state=EntityState.Modified; 
    db.SaveChanges(); 
} 
1

在這種方法中:

public void UpdateItem(ItemViewModel viewModel) 
{ 
    item.UpdatedBy = WebSecurity.CurrentUserName; 
    item.UpdatedAt = DateTime.Now; 
    db.SaveChanges(); 
} 

viewModel來自哪裏? (而且,想一想,什麼是item?)這是一個由客戶端表單調用的操作嗎?我懷疑這裏發生的是客戶端表單不包括CreatedAt的數據,因此在爲此方法構建參數時,模型聯編程序將值保留爲null

模型聯編程序不夠「足夠聰明」去獲取模型的當前持久狀態並將其與來自表單的內容合併。它只有有什麼來自窗體。所以,你基本上有兩種選擇:

  1. 堅持到頁面的表單元素準確地重新構建模型所需的所有數據。
  2. 在頁面的表單元素中至少保留模型的標識符,並在服務器端代碼中使用該標識符從持久數據中重新獲取模型的狀態。

對於第一個選項,您需要包含CreatedAt。這可能是這麼簡單的東西:

@Html.HiddenFor(model => model.CreatedAt) 
0

嘗試這樣

var data= db.Items.where(x=>x.ID==viewModel.ID).SingleOrDefault(); 
    foreach(db.Items in data) 
    { 
     item.UpdatedBy = WebSecurity.CurrentUserName; 
     item.UpdatedAt = DateTime.Now; 
    } 
    db.SaveChanges(); 
相關問題