所以我是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旁边添加一个按钮,这样当我点击它时,所选项目将被传递到视图之外的临时列表,我稍后可以用它来填充原始列表。
答案 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中执行此操作的“常规”方式。