Asp.Net MVC: ¿Por qué mi vista pasa los modelos NULL a mi controlador?

No puedo entender por qué mi vista solo devuelve un NULL para un modelo a mi controlador. Esto es para un método Editar publicación. Comprobé otros controladores con métodos Editar publicación que están estructurados de la misma manera que este y funcionan bien. Parece ser solo esta vista y controlador.

Aquí está mi vista:

@model Non_P21_Quote_System_v1._0.Models.gl_code @{ ViewBag.Title = "Edit"; Layout = "~/Views/Shared/_Layout.cshtml"; } 

Edit

@if (TempData["Message"] != null) {
@TempData["Message"]

} @if (ViewBag.error != null) {

@ViewBag.error


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

gl_code


@Html.ValidationSummary(true, "", new { @class = "text-danger" }) @Html.HiddenFor(model => model.ID)
@Html.LabelFor(model => model.GL_code, "GL Code", htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.GL_code, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.GL_code, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.GL_description, "Gl Description", htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.GL_description, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.GL_description, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.expense_type_ID, "Expense", htmlAttributes: new { @class = "control-label col-md-2" })
@Html.DropDownList("expense_type_ID", null, htmlAttributes: new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.expense_type_ID, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.eag, "Employee Account Group", htmlAttributes: new { @class = "control-label col-md-2" })
@Html.DropDownList("eag", null, htmlAttributes: new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.eag, "", new { @class = "text-danger" })
}
@Html.ActionLink("Back to List", "gl_Index")
@section Scripts { @Scripts.Render("~/bundles/jqueryval") }

Aquí está mi método de controlador:

 [HttpPost] [ValidateAntiForgeryToken] public async Task 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); } 

Cuando lo depuro, veo que el modelo que se pasa es de valor NULL. Estoy viendo esto en el lado del controlador en la parte de parámetros del método de edición.

Es nulo porque su modelo contiene una propiedad llamada gl_code y también ha nombrado el parámetro para su modelo gl_code en el método POST.

Cambie el nombre de uno u otro y el modelo se vinculará correctamente.

Lo que sucede internamente es que el formulario envía un par nombre / valor para cada control de formulario exitoso, en su caso gl_code=someValue . DefaultModelBinder primero inicializa una nueva instancia de su modelo. Luego lee los valores del formulario y encuentra una coincidencia para la propiedad en su modelo y lo establece en someValue . Pero también encuentra una coincidencia en los parámetros del método e intenta establecer el valor del parámetro en someValue , que falla (porque no se puede hacer gl_code gl_code = "someValue"; ) y el modelo se vuelve null .

Parece que tienes una propiedad en tu modelo de vista llamada gl_code. En su controlador, también se refiere al modelo de vista como gl_code.

Intenta cambiar esto.

 public async Task Edit(gl_code gl_code) 

A

 public async Task Edit(gl_code model)