【问题标题】:ASP.Net Core Exception - Could not create a model binder for model object [duplicate]ASP.Net Core 异常 - 无法为模型对象创建模型绑定器 [重复]
【发布时间】:2017-02-07 15:37:25
【问题描述】:

我还是 MVC 的新手,我正在努力解决一个问题,即默认绑定在表单提交到期望视图模型的控制器时失败。我尝试将模型绑定属性 [FromForm] 添加到构造函数,但没有成功,我已经开始阅读自定义绑定器,但在这种情况下感觉有点矫枉过正。如果我需要发布完整的 HTML,我可以这样做。

我真的很感激这方面的一些指导,非常感谢所有帮助?我什至都在努力调试和打断点。

InvalidOperationException:无法为“XX.Models.ClientEditViewModel”类型的模型对象创建模型绑定器。

型号

public partial class ClientEditViewModel
{
  public ClientEditViewModel(List<ProgramViewModel> programs)
  {
    this.Programs = programs;
  }
  public int ClientId { get; set; }
  public string ClientName { get; set; }
  public List<ProgramViewModel> Programs { get; set; }
}

表格

@model XX.Models.ClientEditViewModel
<form asp-action="EditClient" method="post">
      <div class="form-horizontal">
        <input type="hidden" asp-for="@Model.ClientId" />
        <div class="form-group">
            <label asp-for="@Model.ClientName" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="@Model.ClientName" class="form-control" />
                <span asp-validation-for="@Model.ClientName" class="text-danger" />
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Update" class="btn btn-default" />
            </div>
        </div>
    </div>
</form>

控制器

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> EditClient(ClientEditViewModel clientedit)
{
if (ModelState.IsValid)
{
    Client client = await dbcontext.Client.SingleOrDefaultAsync(m => m.Id == clientedit.ClientId);
    try
    {
        client.Name = clientedit.ClientName;
        dbcontext.Client.Update(client);
        await dbcontext.SaveChangesAsync();
    }
    catch (Exception ex)
    {
        string error = ex.InnerException.ToString();
        if (!ClientExists(clientedit.ClientId))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }

    TempData["msg"] = "You have successfully edited " + clientedit.ClientName + ".";
    return RedirectToAction("Index");
}

return null;
}

【问题讨论】:

    标签: c# asp.net-core asp.net-core-mvc model-binding


    【解决方案1】:

    默认绑定使用无参数构造函数,而您的模型具有需要自定义绑定的自定义构造函数。这是一个类似的帖子Posting data when my view model has a constructor does not work

    在您的情况下,Programs 有一个设置器,因此我将完全删除自定义构造函数。

    【讨论】:

    • 问题是重复的,所以答案是多余的
    • 构造函数是问题,感谢您花时间回答。我的问题原来是重复的,但那是因为我没有使用这些术语进行搜索。您的回答非常有帮助,我已经投了赞成票并给予了高度评价。
    • 谢谢,很高兴能帮上忙。这是我提供的第一个答案!
    猜你喜欢
    • 2015-03-28
    • 2011-05-22
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 2018-08-13
    • 2018-12-02
    相关资源
    最近更新 更多