Asp.Net MVC:为什么我的视图将 NULL 模型传递回我的控制器? [英] Asp.Net MVC: Why is my view passing NULL models back to my controller?

查看:23
本文介绍了Asp.Net MVC:为什么我的视图将 NULL 模型传递回我的控制器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不明白为什么我的视图只将模型的 NULL 传回给我的控制器.这是用于 Edit Post 方法的.我检查了其他控制器的 Edit Post 方法,这些方法的结构与这个方法相同,它们工作正常.似乎只有这个视图和控制器.

这是我的观点:

@model Non_P21_Quote_System_v1._0.Models.gl_code@{ViewBag.Title = "编辑";布局 = "~/Views/Shared/_Layout.cshtml";}<h2>编辑</h2>@if (TempData["Message"] != null){<div style="color:green">@TempData["消息"]</div><br/>}@if (ViewBag.error != null){<div style="color:red"><h3>@ViewBag.error</h3></div><br/>}@using (Html.BeginForm()){@Html.AntiForgeryToken()<div class="form-horizo​​ntal"><h4>gl_code</h4><小时/>@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 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 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 class="form-group">@Html.LabelFor(model => model.eag, "员工账户组", 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 class="form-group"><div class="col-md-offset-2 col-md-10"><input type="submit" value="Save" class="btn btn-default"/>

}<div>@Html.ActionLink("返回列表", "gl_Index")

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

这是我的控制器方法:

[HttpPost][验证AntiForgeryToken]公共异步任务Edit([Bind(Include = "ID,GL_code,GL_description,expense_type_ID,eag")] gl_code gl_code){如果(模型状态.IsValid){db.Entry(gl_code).State = EntityState.Modified;等待 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);返回视图(gl_code);}

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

解决方案

它为空,因为您的模型包含名为 gl_code 的属性,并且您还为模型命名了参数 gl_code 在 POST 方法中.

更改其中一个的名称,模型将正确绑定.

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

I cannot figure out why my view only passes back a NULL for a model to my controller. This is for an Edit Post method. I checked other controllers with Edit Post methods that are structured the same way as this one and they work fine. It seems to be just this view and controller.

Here is my view:

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

Here is my controller method:

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

When I debug it, I see the model being passed in is of value NULL. I am seeing this on the controller side at the the parameters part of the Edit method.

解决方案

Its null because your model contains a property named gl_code and you have also named the parameter for your model gl_code in the POST method.

Change the name of one or the other and the model will bind correctly.

What is happening internally is that the form submits a name/value pair for each successful form control, in your case gl_code=someValue. The DefaultModelBinder first initializes a new instance of your model. It then reads the form values and finds a match for the property in your model and sets it to someValue. But it also finds a match in the method parameters and tries set the value of the parameter to someValue, which fails (because you cannot do gl_code gl_code = "someValue";) and the model becomes null.

这篇关于Asp.Net MVC:为什么我的视图将 NULL 模型传递回我的控制器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
其他开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆