2012-12-19 21 views
2

我有一個2種型號:MVC 3 DropDownFor和視圖模型不能正常工作

public class Person 
{ 
    public Guid ID { get; set; } 
    public string Name { get; set;} 
} 

public class Event 
{ 
    public Guid ID { get; set; } 
    public string EventName { get; set; } 
    public virtual Person Owner { get; set; } 
} 

我有一個視圖模型:

public class EventViewModel 
{ 
    public EventViewModel() { } 
    public Event EventToEdit { get; set; } 
    public SelectList People { get; set; } 
} 

我有我的控制器:

public ViewResult Create() 
{ 
    var eve = new Event(); 
    var vm = new EventViewModel 
       { 
        EventToEdit = eve, 
        People = GetPeopleList(true, eve) 
       } 
    return View(vm) 
} 

我有我查看:

@Html.DropDownListFor(x => x.EventToEdit.Owner, Model.People) 

很明顯,它們爲了閱讀目的而被削減。

當我提出我的看法,並創下了ActionResult Create

  1. 斷點它不具有所有者的值(列表中正確填充)
  2. 視圖模型的人也空

使用ViewModel的要點是將視圖中的信息傳遞給控制器​​,所以首先爲什麼People null。

其次也是最重要的是,爲什麼地球上的所有者沒有得到適當的居住。有人可供選擇。事件名稱將通過模型,視圖模型是工作有點被傳遞迴...

感謝,

+0

通過ViewModel如上所示。 –

+0

是的,對不起,我沒有看到它:) – Aviatrix

+0

好吧不用擔心:P –

回答

1

以karaxuna的回答是:

首先,它應該是:

@Html.DropDownListFor(x => x.EventToEdit.Owner.ID, Model.People)

這樣模型。人是這樣的:

new SelectList(source, "ID", "Name", source.ID)

和擴大是:

新的視圖模型:

public class EventViewModel 
{ 
    public EventViewModel() { } 
    public Event EventToEdit { get; set; } 
    public SelectList People { get; set; } 
    public Guid SelectedPerson { get; set; } 
} 

查看綁定:

@Html.DropDownListFor(x => x.SelectedPerson, Model.People) 

然後在控制器:

var person = _repository.People.FirstOrDefault(x => x.ID.CompareTo(vm.SelectedPerson) == 0); 
vm.EventToEdit.Person = person; 
_repository.SaveEvent(vm.EventToEdit); 

我爲了清晰起見回答這個問題,任何搜索到的人都會喜歡看完整頁面。

+0

是的,現在更清楚。 – karaxuna

4

首先,它應該是:

@Html.DropDownListFor(x => x.EventToEdit.Owner.ID, Model.People) 

所以這Model.People成這個樣子了:

new SelectList(source, "ID", "Name", source.ID) 
+0

我看到了某個地方做你所描述的是錯誤的,但是我願意給它一個去看看會發生什麼。 (我在一些帖子中看到它是錯誤的,搜索:dropdownlistfor mvc3) –

+0

所以這是行得通的,並將所選值回發給Owner.ID,它只是沒有通過數據庫並使用正確的值填充它。所以我猜測正確的做法是看我的答案。 –

2

檢查HTML,看看有什麼被放置在在HTML選項元素的值,我懷疑MVC不能施放該數值到EventToEdit.Owner,因爲我認爲它只能處理字符串和整數,儘管如果您需要使用其他數據類型,您可以爲此編寫自定義模型綁定器。

ASP.Net不會回發用於填充效率下拉列表的值(see here)。我個人認爲下拉列表不是很有幫助,它們被設計爲直接從數據庫中顯示數據,因此您可以根據需要重新查詢以獲取控制器中的SelectList值並將其鏈接起來通過在選項值中放置簡單的標識返回到這個重新查詢的列表。

+0

那麼你是說,從列表中獲取存儲的selectedvalue,然後查詢數據庫,然後在控制器中填充Person。這就說得通了。 –

+0

以上是一種方法 - 在您的ViewModel中爲您的「People」和「Event」對象(例如'List '和'EventID')添加字段,然後在您的後控制器中重新水化這些對象。另一個選擇是使用Automapper將對象展平,然後將值映射回您的後控制器(請參閱http://stackoverflow.com/questions/7580392/how-to-map-multiple-objects-to-one-object - 使用 - automapper-ASP淨MVC-3)。 –

+0

另請參閱本教程http://consultingblogs.emc.com/owainwragg/archive/2010/12/22/automapper-mapping-from-multiple-objects.aspx –