【问题标题】:Asp.Net MVC: Why is my view passing NULL models back to my controller?Asp.Net MVC:为什么我的视图将 NULL 模型传回我的控制器?
【发布时间】:2016-04-24 02:56:00
【问题描述】:

我无法弄清楚为什么我的视图只将模型的 NULL 传回给我的控制器。 这适用于 Edit Post 方法。我检查了其他控制器的 Edit Post 方法,这些方法的结构与这个方法相同,它们工作正常。好像只有这个视图和控制器。

这是我的看法:

@model Non_P21_Quote_System_v1._0.Models.gl_code

@{
    ViewBag.Title = "Edit";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Edit</h2>

@if (TempData["Message"] != null)
{
    <div style="color:green">
        @TempData["Message"]
    </div><br />
}
@if (ViewBag.error != null)
{
    <div style="color:red">
        <h3>@ViewBag.error</h3>
    </div><br />
}

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>gl_code</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        @Html.HiddenFor(model => model.ID)

        <div class="form-group">
            @Html.LabelFor(model => model.GL_code, "GL Code", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.GL_code, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.GL_code, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.GL_description, "Gl Description", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.GL_description, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.GL_description, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.expense_type_ID, "Expense", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownList("expense_type_ID", null, htmlAttributes: new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.expense_type_ID, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.eag, "Employee Account Group", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownList("eag", null, htmlAttributes: new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.eag, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "gl_Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

这是我的控制器方法:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit([Bind(Include = "ID,GL_code,GL_description,expense_type_ID,eag")] gl_code gl_code)
{
    if (ModelState.IsValid)
    {           
        db.Entry(gl_code).State = EntityState.Modified;
        await db.SaveChangesAsync();
        return RedirectToAction("gl_Index");      
    }
    ViewBag.eag = new SelectList(db.employee_account_group, "ID", "eag_name");
    ViewBag.expense_type_ID = new SelectList(db.expense_type, "ID", "type", gl_code.expense_type_ID);
    return View(gl_code);
}

当我调试它时,我看到传入的模型的值为 NULL。我在控制器端的 Edit 方法的参数部分看到了这一点。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    它为 null,因为您的模型包含一个名为 gl_code 的属性,并且您还在 POST 方法中将模型的参数命名为 gl_code

    更改一个或另一个的名称,模型将正确绑定。

    内部发生的是表单为每个成功的表单控件提交一个名称/值对,在您的情况下为gl_code=someValueDefaultModelBinder 首先初始化模型的一个新实例。然后它读取表单值并在模型中找到匹配的属性并将其设置为someValue。但它也在方法参数中找到了匹配项,并尝试将参数的值设置为someValue,但失败(因为您无法执行gl_code gl_code = "someValue";)并且模型变为null

    【讨论】:

    • 令人难以置信的是,我花了一个小时把头发拉出来。
    【解决方案2】:

    您的视图模型上似乎有一个名为 gl_code 的属性。在您的控制器中,您还将视图模型称为 gl_code。

    尝试更改此设置。

    public async Task<ActionResult> Edit(gl_code gl_code)
    

    public async Task<ActionResult> Edit(gl_code model)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多