【问题标题】:Model from view to controller comes null从视图到控制器的模型为空
【发布时间】:2015-05-15 10:18:04
【问题描述】:

我有一个索引视图调用部分视图,我在其中列出了我的模型(一个 IEnumerable)并绘制复选框以选择一些要更新的项目。

我用 ajax 表单包装了部分视图,以发送模型(带有选中的复选框),但是当它到达控制器操作“Enviar”时,自定义对象参数为空

我不知道为什么,根据一些帖子我的代码应该可以工作,请问我做错了什么?

索引视图

@model IEnumerable<beDGRAIC.T_Sedd_Cuadro_Envio_Empresa>
.....
@Html.Partial("_ListaResumenCarga", Model)
.....

_ListaResumenCarga 视图

@model IEnumerable<beDGRAIC.T_Sedd_Cuadro_Envio_EmpresaViewModel>

@using (Ajax.BeginForm("Enviar", "Upload", new { @id = "FormCabecera" },
new System.Web.Mvc.Ajax.AjaxOptions()
{
    HttpMethod = "POST",
    InsertionMode = System.Web.Mvc.Ajax.InsertionMode.Replace,
    UpdateTargetId = "SeccionListado",
    OnSuccess = "RefrescaListado"
}))
{
    <table>
        <tbody>
            @if (Model != null)
            {
                foreach (var item in Model)
                {
                    <tr>
                        <td class="text-center">@Html.EditorFor(modelItem => item.Seleccionado, new { @checked = "checked" })</td>
                        <td class="text-left">@Html.DisplayFor(modelItem => item.Categoria)</td>
                        <td class="text-left">@Html.DisplayFor(modelItem => item.Codigo)</td>
                        <td class="text-left">@Html.DisplayFor(modelItem => item.Nombre)</td>
                        <td class="text-center">@Html.DisplayFor(modelItem => item.Nro_Registros)</td>
                    </tr>
                    @Html.HiddenFor(modelItem => item.Seleccionado)
                    @Html.HiddenFor(modelItem => item.Id_Cuadro_Envio)
                }
            }
        </tbody>
    </table>
    <button type="submit">Enviar</button>
}

上传控制器

public class UploadController : Controller
{
    [HttpPost]
    public ActionResult Enviar(IEnumerable<T_Sedd_Cuadro_Envio_EmpresaViewModel> lT_Sedd_Cuadro_Envio_EmpresaViewModel)
    {
        ....
        return View("Envios", vT_Sedd_Envio_Empresa);
    }
}

模型类

[DataContract]
[Serializable]
public partial class T_Sedd_Cuadro_Envio_EmpresaViewModel : BEPaginacion
{
    [DataMember]
    public bool Id { get; set; }
    [DataMember]
    public bool Seleccionado { get; set; }
    [DataMember]  
    public int Id_Cuadro_Envio { get; set; }  
    [DataMember]  
    public int Id_Envio_Empresa { get; set; }  
    [DataMember]  
    public string Categoria { get; set; }  
    .... // more properties
}

【问题讨论】:

  • 您需要编辑您的问题并删除所有不相关的代码!基本问题是你部分生成重复的id(无效的html)和name属性(所以不能绑定到一个集合)。您需要使用for 循环(模型需要为IList&lt;beDGRAIC.T_Sedd_Cuadro_Envio_Empresa&gt;)或自定义EditorTemplate for typeof T_Sedd_Cuadro_Envio_Empresa。然后你有 EditorFor() 代表 Seleccionado ,然后是 HiddenFor() 代表相同的属性 - 即使你命名控件属性,它也只会发回原始值,而不是编辑后的值。
  • 绑定到一个集合是一种痛苦。考虑改为每行表格
  • 谢谢斯蒂芬!它成功了!发布我所有代码的原因是我在其他帖子中看到用户要求这样做。如果您愿意,您可以发表您的评论作为答案,将其标记为解决方案...非常感谢
  • @culebrin,我冒昧地删除了您问题中的大部分代码,只保留相关的内容。请参考How to create a Minimal, Complete, and Verifiable example
  • 非常感谢你,但我很难意识到我的代码中的哪一部分是我的错误的相关部分,这就是我决定放洞代码的原因。现在我可以分析您的编辑以改进我未来的问题。非常感谢。

标签: c# asp.net-mvc ajaxform


【解决方案1】:

您在部分中使用foreach 循环会生成重复的id(无效的html)和name 属性,这意味着它不能绑定到集合。对于T_Sedd_Cuadro_Envio_EmpresaViewModel 类型,您需要使用for 循环或自定义EditorTemplate。此外,您正在为属性Seleccionado 生成一个复选框和一个隐藏输入

编辑器模板 /Views/Shared/EditorTempplates/T_Sedd_Cuadro_Envio_EmpresaViewModel.cshtml

@model T_Sedd_Cuadro_Envio_EmpresaViewModel
<tr>
  <td>
    @Html.CheckBoxFor(m => m.Seleccionado)</td> // do not set the checked attribute!
    @Html.HiddenFor(m => m.Id_Cuadro_Envio) // inside a td element
  </td>
  <td>@Html.DisplayFor(m => m.Categoria)</td>
  .... // other properties to display/edit
</tr>

然后在局部

@model IEnumerable<beDGRAIC.T_Sedd_Cuadro_Envio_EmpresaViewModel>
@using (Ajax.BeginForm("Enviar", "Upload", ....))
{
  <table>
   <thead>
     .... // table headings
   </thead>
   <tbody>
     @EditorFor(m => m) // this will render all the rows
   </tbody>
  </table>
  <button type="submit">Enviar</button>
}

旁注:

  1. 一个 html 助手绑定到一个属性的值(在你的例子中是bool Categoria),这意味着如果Categoria 的值是true, 该复选框将被选中,否则将取消选中。不要 尝试设置checked 属性,无论如何它不会 工作,因为您没有正确使用重载)
  2. &lt;input&gt; 不是 &lt;tr&gt; 元素的有效子元素
  3. 您已将班级命名为T_Sedd_Cuadro_Envio_EmpresaViewModel 建议它是一个视图模型,显然不是(在我编辑之前 它包含 17 个属性,但您只在视图中使用了 6 个)。视图模型 表示您要在视图中显示/编辑的内容 - 请参阅 What is a viewmodel in mvc(请保持简单,只需 EmpresaViewModelpublic ActionResult Enviar(IEnumerable&lt;EmpresaViewModel&gt; model)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多