我的创建操作是否需要自定义模型绑定器

本文关键字:自定义 模型 绑定 创建 操作 是否 我的 | 更新日期: 2023-09-27 17:56:26

我一直在对此进行一些研究,但是,我在理解MVC 3中何时需要模型绑定时遇到了一些麻烦。 我创建了一个视图模型来向我的"创建"视图提供数据。

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

我的邀请请求控制器具有以下操作方法

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){ }

然后我可以看到发布的值。 我希望不必在控制器中执行自己的映射代码。
自定义模型绑定器是答案吗?

编辑我正在使用类型为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>

我的创建操作是否需要自定义模型绑定器

必须为InvitationRequestViewModel指定无参数构造函数,以便默认模型绑定器可以实例化它。