我一直在对此进行一些研究,但是我在理解MVC 3中何时需要进行模型绑定时遇到了一些麻烦。我创建了一个ViewModel来为我的Create视图提供数据。
public class InvitationRequestViewModel
{
public InvitationRequest InvitationRequest { get; private set; }
public IEnumerable<SelectListItem> EventsList { get; private set; }
public string EventId { get; set; }
public InvitationRequestViewModel(InvitationRequest request)
{
InvitationRequest = request;
EventsList = new SelectList(MyRepositoryAndFactory.Instance.FindAllEvents()
.Select(events => new SelectListItem
{
Value = events.ID.ToString(),
Text = String.Format("{0} - {1} - {2}", events.Name, events.Location, events.StartDate.ToShortDateString())
}
), "Value", "Text");
}
}
我的InvitationRequest控制器具有以下Action方法
public ActionResult Create()
{
InvitationRequest request = new InvitationRequest(User.Identity.Name);
return View(new InvitationRequestViewModel(request));
}
[HttpPost]
public ActionResult Create(InvitationRequestViewModel newInvitationRequest)
{
try
{
if (!ModelState.IsValid) return View(newInvitationRequest);
newInvitationRequest.InvitationRequest.Save();
MyRepositoryAndFactory.Instance.CommitTransaction();
return RedirectToAction("Index");
}
catch
{
ModelState.AddModelError("","Invitation Request could not be created");
}
return View(newInvitationRequest);
}
我可以毫无问题地访问“创建”视图,并且DDL中填充了可用事件列表。我的问题是我希望将InvitationRequestViewModel映射到HttpPost Create方法。相反,我只是得到一个错误,说“网站无法显示页面”。 当我使用签名时:
public ActionResult Create(FormCollection collection){ }
然后我可以看到发布的值。我原本希望不必在控制器中做我自己的映射代码 是自定义ModelBinder的答案吗?
EDIT 我使用类型为InvitationRequestViewModel的强类型视图,这是DDL代码
<div class="editor-label">
@Html.LabelFor(model => model.InvitationRequest.Event)
</div>
<div class="editor-field">
@Html.DropDownListFor(x => x.EventId, Model.EventsList)
</div>
答案 0 :(得分:1)
您必须为InvitationRequestViewModel
指定无参数构造函数,以便默认模型绑定器可以实例化它。