将选定的值从我的视图中传递到列表中

时间:2013-05-01 06:34:38

标签: asp.net-mvc listbox multi-select

所以我是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();
    }

这是我在视图中的代码(我遗漏了其他字段的编辑器,它们都按预期工作):

 <div class="editor-label">
        @Html.Label("Add Events")
    </div>
    <div class="editor-field">
        @Html.ListBox("EventId")   
        @Html.ValidationMessageFor(model => model.Events)                      
  </div>  

这是我在控制器中的回发方法:

    [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字段仍然是一个空引用,所以我想知道如何将我选择的项添加到List Events字段。我已经在互联网上做了一些研究,但我得到的都是复杂的解决方案,比如FormCollections,使用JQuery等等。它应该以一种非常简单的方式解决,因为这是一个学校项目,他们不指望我们使用JQuery或高级编程。我一直在考虑在EventListBox旁边添加一个按钮,这样当我点击它时,所选项目将被传递到视图之外的临时列表,我稍后可以用它来填充原始列表。

2 个答案:

答案 0 :(得分:1)

  

现在很明显,List Events字段仍然是一个空引用,所以   我想知道,如何将我选择的项目添加到列表中   事件领域。

您无法使用OtherMeeting课程的当前结构。您显然不想使用FormCollections,如果您只需向IEnumerable int添加OtherMeeting,就可以干净地这样做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)

然后在您的视图中将其用作

{{1}}

答案 1 :(得分: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);
}

现在在视图中创建多选列表,定义值和说明字段,并将Model.EventIds作为所选项目列表传递:

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

现在,在您的帖子请求中,您只需访问otherMeeting.EventIds即可获得所选活动的列表。

这是在ASP.NET MVC中执行此操作的“常规”方式。