ASP.NET 核心模型绑定无缘无故地不起作用

ASP.NET Core Model Binding Not Working for No Apparent Reason

提问人:Emre Bener 提问时间:10/18/2023 更新时间:10/18/2023 访问量:30

问:

我正在尝试将模型绑定到视图(更具体地说,是部分视图)。当我调试代码时,我可以清楚地看到传递给视图的正确对象,但在浏览器 DevTools 中,我看到响应为空窗体。我确实得到了一个视图,但模型没有绑定到它,所以表单是空的。

供您参考,以下是部分视图代码:

@model MyApp.Models.Company

<form  method="post" id="editForm" enctype="multipart/form-data">

    <div class="form-group">
        <label asp-for="Name" class="control-label"></label> <span style="color:red;">*</span>
        <input asp-for="Name" class="form-control" />
    </div>
    <div class="form-group">
        <label asp-for="IsActive" class="control-label"></label>
        <input type="checkbox" asp-for="IsActive" class="form-check-input" style="display: block;" value="true" />
    </div>

    <input type="hidden" asp-for="Id" />
    <div id="errorContainer" style="color:red; background-color: #ffedf0; border-radius: 0.25rem;"></div>

</form>

这是处理请求并返回部分视图的控制器操作。请注意,完全相同的代码适用于另一个项目:

public IActionResult EditPopup(Guid id) // returns `edit` partial view
{
    try
    {
        var model = _context.Companies.Where(x => x.Id.ToString() == id.ToString()).FirstOrDefault();

        if (model == null)
            return Problem(statusCode: 400, detail: "Bad Request"); // 400 Bad Request

        return PartialView("_EditPartial", model);
    }
    catch (Exception ex)
    {
        // TODO logla
        return Problem(statusCode: 500, detail: "An unexpected error happened"); // 500 Internal Server Error
    }
}

我在任何地方都没有错误。VS 或浏览器控制台中没有错误。在 VS 中的“输出”窗口中也不会记录任何内容。此外,更改调试>异常设置以中断所有异常也没有任何作用,因此似乎没有在任何地方抛出异常。

为什么模型绑定会失败?我错过了什么?

asp.net asp.net-mvc asp.net-core model-view-controller model-binding

评论


答:

0赞 Emre Bener 10/18/2023 #1

发生这种情况是因为该项目最初是一个剃刀页面应用程序,我后来使用 和 添加了控制器和视图,但显然将 MVC 添加到项目所需的配置并不止于此,我还需要手动创建一个文件来导入一些东西。AddControllersWithViewsMapControllerRoute_ViewImports.cshtml

直接在文件夹下创建,并在其中,使用指令导入模型命名空间,并添加 asp.net 核心 mvc 标记助手。它看起来像:_ViewImports.cshtmlViews@using

@using MyApp.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

需要 asp.net 标记帮助程序才能使框架识别和处理“asp-for”属性。现在模型绑定将起作用。