2010-07-13 45 views
1

我開始用nhibernate和asp mvc2開發Web應用程序(應用程序組合)。如何高效地用asp mvc和nhibernate引用(dropdownList)更新模型

我有一些困難來正確地改變應用程序的類別。
這裏是我的模型:

public class Application 
{ 
    public virtual int Application_ID{ get; private set; } 
    public virtual string Name { get; set; } 
    public virtual Category Category { get; set; } 
} 
public class Category : ILookupItem 
{ 
    public virtual int Category_ID { get; set; } 
    public virtual string Name { get; set; } 
} 

我的視圖模型:

public class ApplicationEditModel 
{ 
    public Application Application { get; set; } 
    public SelectList Categories { get; set; } 
} 

我的表格:

<% Html.BeginForm(new {id= Model.Application.Application_ID }); %> 
<table> 
<tr> 
    <td><%=Html.LabelFor(x => x.Application.Application_ID)%></td> 
    <td><%=Html.DisplayFor(x=>x.Application.Application_ID) %></td> 
</tr> 
<tr> 
    <td><%=Html.LabelFor(x=>x.Application.Name) %></td> 
    <td><%=Html.EditorFor(x=>x.Application.Name) %></td> 
</tr> 
<tr> 
    <td><%=Html.LabelFor(x=>x.Application.Category) %></td> 
<td><%=Html.DropDownListFor(x=>x.Application.Category.Category_ID,Model.Categories,"Select a category") %></td> 
</tr> 
<tr><td><input type="submit" /></td></tr> 
</table> 
<% Html.EndForm(); %> 

我的控制器動作:

[HttpPost] 
    public ActionResult Edit(int id, FormCollection collection) 
    { 
     Application app = _service.FindById(id); 
     TryUpdateModel<Application>(app, "Application"); 
     _service.CommitChanges(); 
     return RedirectToAction("Index"); 
    } 

我能屁股IGN一個新的類別,但如果我更改爲不同的類別,我得到了以下信息:

從2改變Core.Model.Category的實例標識符3

這似乎是因爲defaultmodelbinder正在更新指定類別的密鑰,而不是使用新的新密鑰分配新類別。

更新實體及其所有參考的正確方法是什麼?
我可以使用自定義視圖模型,將其綁定到控制器中,然後將其映射到我的域模型。但我擔心它會給我太多的工作(最終我的應用程序模型中將有大約100個屬性,30個引用和5-6個列表)。
Automapper在這種情況下可以用來更新現有的域模型嗎?
你如何處理這種更新?

+0

您是否找到解決此問題的方法。我現在正在遇到一模一樣的問題。我正在使用MVC3 – nabeelfarid 2011-06-07 23:06:43

回答

2

除非您有一個非常簡單的應用程序,否則很難使用與視圖和域模型相同的模型。擁有獨立域模型的另一個原因是,爲所有100個屬性顯示一個巨大的表單並不是非常方便用戶。您可以更好地向用戶展示不同的任務形式。當你這樣做時,無論如何你最終會得到一個域實體的不同視圖模型。

+0

好吧,我可以很容易地將我的模型分成幾個視圖模型,但是如何更新模型呢?手動通過複製到更新後的視圖模型的屬性到域模型? 你如何處理列表中的更新?通過循環列表並比較項目? – Lobo 2010-07-14 06:43:54

+0

是的。大多數情況下,我在域模型中調用一個方法來更改屬性。方法名稱是域模型的重要組成部分,因爲標識了域的使用方式。 – Paco 2010-07-14 10:18:47