将选定的值从我的视图中传递到列表
所以我是新来的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旁边添加一个按钮,这样当我点击它时,选定的项目将被传递到视图外部的一个临时列表,我可以稍后使用它填充原始列表。
您应该使用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中这样做的“常规”方式。
现在很明显的列表活动领域仍然是空引用,所以 我在想,我怎么加我已选择列表 活动领域的项目。
您无法使用OtherMeeting
类的当前结构。你显然不想使用FormCollections
,我建议你不要,如果你可以干净地只需在OtherMeeting
类增加一个IEnumerable
的int
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)
因此,ViewBag.EventId现在被定义为eventid的列表,而不是正确的事件? – 2013-05-01 07:15:22
列表框只会给你一个'value',一个原始类型而不是一个复杂的类型。所以你需要用这样的属性来提供它(例如一个int列表)。 – 2013-05-01 07:19:16
这个答案是基于这样一个假设,即事件类只有一个id和学科领域的权利? – 2013-05-01 08:28:36
@RobinHellemans不一定 - 它基于这样的假设:那些是您视图所需的唯一字段。创建一个只包含这些字段的新ViewModel,并像我在上面的“Create”方法中那样从控制器中的“Event”对象填充它们。您不应该将您的域实体暴露给您的视图。 – 2013-05-01 08:32:23
好吧,我很难理解你究竟在干什么。这部分代码: 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