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; }
}

给我带来问题的是 List 字段。

我的控制器中有以下代码:

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 旁边添加一个按钮,这样当我单击它时,选定的项目将被传递到视图之外的临时列表,我以后可以使用它来填充原始列表。

4

2 回答 2

1

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

你不能用你OtherMeeting班级的当前结构。你显然不想使用,如果你可以通过在你的类中添加一个of s 来干净地FormCollections做到这一点,我建议你不要使用。IEnumerableintOtherMeeting

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)
于 2013-05-01T06:54:34.310 回答
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 中执行此操作的“常规”方式。

于 2013-05-01T07:08:01.163 回答