假設我想允許在頁面上選擇我們的實體(從下拉列表等),讓我們說產品。因此,我可能會收到這樣的:我的自定義ASP.NET MVC實體綁定:這是一個很好的解決方案嗎?
public ActionResult SelectedAction(Guid productId)
{
}
不過,我想用模型聯電,所以不是我寫的模型綁定從儲備庫中獲得我的產品,轉而使用
public ActionResult SelectedAction(Product product)
{
if (ModelState.IsValid) {} else {}
}
我的模型綁定如果產品無效,則將模型狀態設置爲false。 現在,正在使用這種方法的問題:
- 這並不總是易於使用強類型的方法,如Html.ActionLink(C => c.SelectedAction(ID)),因爲我們需要傳遞的產品,而不是ID。
- 無論如何,使用實體作爲控制器參數並不好。
- 如果模型狀態無效,並且我想重定向回來並顯示錯誤,我無法保留所選產品!因爲綁定的產品沒有設置,我的ID不存在。我想要做RedirectToAction(c => c.Redisplay(product)),但當然這是不可能的。
現在,似乎我回來使用「Guid productId」作爲參數...但是,有一個解決方案,我想提出和討論。
public class EntityViewModel<T> where T : BaseEntity
{
public EntityViewModel(Guid id)
{
this.Id = id;
}
public static implicit operator EntityViewModel<T>(T entity)
{
return new EntityViewModel<T>(entity.Id);
}
public override string ToString()
{
return Id.ToString();
}
public Guid Id { get; set; }
public T Instance { get; set; }
}
現在,如果我用
public ActionResult SelectedAction(EntityViewModel<Product> product)
{
if (ModelState.IsValid) {} else {}
}
所有的問題都解決了:
- 我只能與ID傳遞EntityViewModel設置,如果我只有編號。
- 我不使用實體作爲參數。而且,I 可以使用EntityViewModel作爲另一個ViewModel中的屬性。
- 我可以將EntityViewModel傳遞迴RedirectToController,它將保持其Id值,這將隨着驗證消息(感謝MVCContrib和ModelStateToTempData/PassParametersDuringRedirect)重新顯示給用戶 。
模型聯編程序將從存儲庫中獲取實例,並將設置模型狀態錯誤,如「在數據庫中未找到」等。我可以使用ActionLink(c => c.Action(Model.MyProductViewModelProperty))。
問題是,這裏有什麼缺點嗎?我看不出有什麼不好,但我仍然對MVC不熟悉,可能會錯過一些重要的事情。也許有更好的和批准的方式?也許這就是爲什麼每個人都使用實體ID作爲輸入參數和屬性?
+1有趣的方法... – 2009-09-21 09:39:09
+1這是一個體面的方法。我喜歡。 – grenade 2009-09-21 09:51:32