2013-05-01 42 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

相关问题