2013-05-01 89 views
1

所以我是新來的asp.net MVC 4編程,我碰到了另一個問題。將選定的值從我的視圖中傳遞到列表

這是我的模型類:

public class OtherMeeting 
{ 
public int OtherMeetingId { get; set; } 
[Required(ErrorMessage="Name is required")] 
public String Name { get; set; } 
[Required(ErrorMessage="Location is required")] 
public String Location { get; set; } 
[DataType(DataType.Date)] 
[Required(ErrorMessage="Date is required")] 
public DateTime StartDate { get; set; } 
[DataType(DataType.Date)] 
[DateGreaterThan("StartDate")] 
public DateTime EndDate { get; set; } 
public int CountryId { get; set; } 
public virtual Country Country { get; set; } 
public Type Type { get; set; } 

public int EventId { get; set; } 
public List<Event> Events { get; set; } 
} 

這是一個的給我的問題列表字段。

我在我的控制器下面的代碼:

public ActionResult Create() 
    { 
     ViewBag.EventId = new MultiSelectList(db.Events, "EventId", "Discipline"); 
     ViewBag.CountryId = new MultiSelectList(db.Countries, "CountryId", "CountryName"); 
     return View(); 
    } 

這是我在我的視圖代碼(我離開了編輯的其他領域,他們所有的工作,因爲他們應該):

​​

這是在控制器我回發方法:

[HttpPost] 
    public ActionResult Create(OtherMeeting otherMeeting) 
    { 
     if (ModelState.IsValid) 
     {    
      db.OtherMeetings.Add(otherMeeting); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     ViewBag.EventId = new MultiSelectList(db.Events, "EventId", "Discipline"); 
     ViewBag.CountryId = new MultiSelectList(db.Countries, "CountryId", "CountryName"); 
     return View(otherMeeting); 
    } 

現在很明顯的列表活動場仍然是空引用,所以我想知道,如何將我已選擇的項目添加到List Events字段。我在互聯網上做了一些研究,但我所得到的都是複雜的解決方案,如FormCollections,使用JQuery等等。它應該可以用一種非常簡單的方法解決,因爲這全部用於學校項目,而且他們不指望我們使用JQuery或高級編程。我也一直在考慮在EventListBox旁邊添加一個按鈕,這樣當我點擊它時,選定的項目將被傳遞到視圖外部的一個臨時列表,我可以稍後使用它填充原始列表。

回答

1

您應該使用ListBoxFor選擇擴展。

首先,爲您的事件定義一個視圖模型 - 不要只使用您的域模型(數據庫)類。

public class EventViewModel 
{ 
    public string ID { get; set; } 
    public string Name { get; set; } 
} 

現在改變現有的視圖模型具有以下(一切爲了視圖真的應該是模型,因爲這就是它是爲 - 避免ViewBag您可以在其中):

public List<EventViewModel> Events { get; set; } 
public List<int> EventIds { get; set; } 

現在,在您的第一個控制器方法中,實例化模型並列出並用Event對象填充它:

public ActionResult Create() 
{ 
    var model = new OtherMeeting(); 
    foreach (Event e in db.Events) 
    { 
     var eventModel = new EventViewModel { 
      Id = e.EventId, 
      Name = e.Discipline 
     }; 
     model.Events.Add(eventModel); 
    } 

    return View(model); 
} 

現在,在您的視圖中創建您的multiselectlist,定義值和描述字段和Model.EventIds通過所選擇的項目列表:

@Html.ListBoxFor(m => m.EventIds, 
    new MultiSelectList(Model.Events, "Id", "Name", Model.EventIds)) 

現在,在您的文章的要求,你可以訪問otherMeeting.EventIds的名單選定的事件。

這是在ASP.NET MVC中這樣做的「常規」方式。

+0

這個答案是基於這樣一個假設,即事件類只有一個id和學科領域的權利? – 2013-05-01 08:28:36

+0

@RobinHellemans不一定 - 它基於這樣的假設:那些是您視圖所需的唯一字段。創建一個只包含這些字段的新ViewModel,並像我在上面的「Create」方法中那樣從控制器中的「Event」對象填充它們。您不應該將您的域實體暴露給您的視圖。 – 2013-05-01 08:32:23

+0

好吧,我很難理解你究竟在幹什麼。這部分代碼: public ActionResult Create() { var model = new OtherMeeting(); 的foreach(在db.Events事件E) { 變種eventModel =新EventViewModel { 編號= e.EventId, 名稱= e.Discipline }; model.Events.Add(eventModel); } return View(model); } 正如我所看到的,我將EventViewModel對象添加到我的列表事件字段中。但一個事件有多個字段,所以它只會爲其他字段添加空值?如果它們不可空? – 2013-05-01 08:55:21

1

現在很明顯的列表活動領域仍然是空引用,所以 我在想,我怎麼加我已選擇列表 活動領域的項目。

您無法使用OtherMeeting類的當前結構。你顯然不想使用FormCollections,我建議你不要,如果你可以乾淨地只需在OtherMeeting類增加一個IEnumerableint s。

public class OtherMeeting { 
    public IEnumerable<int> EventIds {get;set;} 
} 

然後在您的視圖中使用它作爲

@Html.ListBox("EventIds", (MultiSelectList)ViewBag.EventId) 
// but I suggest you do this instead 
// and let the razor engine take care of the "element naming" for you 
@Html.ListBoxFor(x=>x.EventIds, (MultiSelectList)ViewBag.EventId) 
+0

因此,ViewBag.EventId現在被定義爲eventid的列表,而不是正確的事件? – 2013-05-01 07:15:22

+0

列表框只會給你一個'value',一個原始類型而不是一個複雜的類型。所以你需要用這樣的屬性來提供它(例如一個int列表)。 – 2013-05-01 07:19:16