Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC4将ViewModel发送到控制器_C#_Asp.net Mvc_Asp.net Mvc 4_Razor - Fatal编程技术网

C# MVC4将ViewModel发送到控制器

C# MVC4将ViewModel发送到控制器,c#,asp.net-mvc,asp.net-mvc-4,razor,C#,Asp.net Mvc,Asp.net Mvc 4,Razor,我试图将包含在两个列表中的ViewModel传递给控制器,但在控制器操作中得到空结果。我一直在网上搜索答案,但似乎找不到我能用的东西 我试着让它按照我的计划运行,但我被卡住了 这是我的ViewModel: public class ItemsConciliacionManualViewModel { public string TituloOrigen1 { get; set; } public string TituloOrigen2 { get; set; } pub

我试图将包含在两个列表中的ViewModel传递给控制器,但在控制器操作中得到空结果。我一直在网上搜索答案,但似乎找不到我能用的东西

我试着让它按照我的计划运行,但我被卡住了

这是我的ViewModel:

public class ItemsConciliacionManualViewModel
{
    public string TituloOrigen1 { get; set; }
    public string TituloOrigen2 { get; set; }
    public List<ConciliacionItem> noConciliadasOrigen1 { get; set; }
    public List<ConciliacionItem> noConciliadasOrigen2 { get; set; }
}
我要处理的是同一类型模型的两个列表,如果我只将一个列表传递给操作(我以前已经这样做过),这实际上是可行的,但是出于可用性的目的,我必须将两个列表分开显示

我不需要ViewModel的字符串,只需要列表。其他参数“string motivo”工作正常

提前谢谢

编辑:添加了局部视图的代码:

@model List<RECON.DAL.Models.ConciliacionItem>
@using RECON.Resources
@using GridMvc.Html
@using RECON.DAL.Models

@{
    IEnumerable<ConciliacionItemDiseno> conciliacionItemDiseno = new List<ConciliacionItemDiseno>();
    var itemDiseno = (IEnumerable<ConciliacionItemDiseno>)ViewBag.ConciliacionItemDisenos;
}

@Html.Grid(Model).Columns(columns =>
                              {
                                  columns.Add(foo => foo.ClaveConciliacion, true).Titled("ClaveConciliacion");

                              columns.Add(foo => foo.Id).Titled("Id");

                              columns.Add(foo => foo.OrigenDescripcion).Titled("Origen");

                              // VARCHARS

                              conciliacionItemDiseno = itemDiseno.Where(x => x.Campo == "Varchar1");
                              if (conciliacionItemDiseno.Any())
                              {
                                  columns.Add(foo => foo.Varchar1)
                                                  .Titled((conciliacionItemDiseno.FirstOrDefault(x => x.Diseno.Codigo == "Titulo") != null ? conciliacionItemDiseno.FirstOrDefault(x => x.Diseno.Codigo == "Titulo").Valor : string.Empty))
                                                  .Css((conciliacionItemDiseno.FirstOrDefault(x => x.Diseno.Codigo == "Align") != null) ? ((conciliacionItemDiseno.FirstOrDefault(x => x.Diseno.Codigo == "Align").Valor == "C") ? "text-center" : (conciliacionItemDiseno.FirstOrDefault(x => x.Diseno.Codigo == "Align").Valor == "R") ? "text-right" : "text-left") : string.Empty)
                                                  .SetWidth((conciliacionItemDiseno.FirstOrDefault(x => x.Diseno.Codigo == "Width") != null) ? conciliacionItemDiseno.FirstOrDefault(x => x.Diseno.Codigo == "Width").Valor : string.Empty);
                              })
@型号列表
@使用侦察资源
@使用GridMvc.Html
@使用侦察模型
@{
IEnumerable conciliacionItemDiseno=新列表();
var itemDiseno=(IEnumerable)ViewBag.ConciliacionItemDisenos;
}
@Html.Grid(Model).Columns(Columns=>
{
columns.Add(foo=>foo.ClaveConciliacion,true)。标题为(“ClaveConciliacion”);
columns.Add(foo=>foo.Id).标题为(“Id”);
columns.Add(foo=>foo.OrigenDescripcion).标题为(“Origen”);
//瓦查尔斯
调解书编号=项目编号,其中(x=>x.Campo==“Varchar1”);
if(调解书编号:Any())
{
columns.Add(foo=>foo.Varchar1)
.title((conciliacionItemDiseno.FirstOrDefault(x=>x.Diseno.Codigo==“Titulo”)!=null?conciliacionItemDiseno.FirstOrDefault(x=>x.Diseno.Codigo==“Titulo”).Valor:string.Empty)
.Css((conciliacionItemDiseno.FirstOrDefault(x=>x.Diseno.Codigo==“Align”)!=null)((conciliacionItemDiseno.FirstOrDefault(x=>x.Diseno.Codigo==“Align”).Valor==“C”)?“文本中心”:(conciliacionItemDiseno.FirstOrDefault(x=>x.Diseno.Codigo==“Align”).Valor==“R”)?“文本右”:“文本左”):string.Empty)
.SetWidth((conciliacionItemDiseno.FirstOrDefault(x=>x.Diseno.Codigo==“Width”)!=null)?conciliacionItemDiseno.FirstOrDefault(x=>x.Diseno.Codigo==“Width”).Valor:string.Empty;
})
更改此选项:

@using (Html.BeginForm("GrabarConciliacionManual", "ConciliacionItem", FormMethod.Post, new { ListaAConciliarManual = Model }))
为此:

@using (Html.BeginForm("GrabarConciliacionManual", "ConciliacionItem", FormMethod.Post))

您可以将构造函数添加到
ItemsConciliacionManualViewModel
中,并在该构造函数中初始化两个列表

大概是这样的:

public class ItemsConciliacionManualViewModel
{
    public ItemsConciliacionManualViewModel()
    {
        this.noConciliadasOrigen1 = new List<ConciliacionItem>();
        this.noConciliadasOrigen2 = new List<ConciliacionItem>();
    }

    public string TituloOrigen1 { get; set; }
    public string TituloOrigen2 { get; set; }
    public List<ConciliacionItem> noConciliadasOrigen1 { get; set; }
    public List<ConciliacionItem> noConciliadasOrigen2 { get; set; }
}
公共类项ConciliacionManualViewModel
{
公共项目ConciliacionManualViewModel()
{
this.noConciliadasOrigen1=新列表();
this.noConciliadasOrigen2=新列表();
}
公共字符串TituloOrigen1{get;set;}
公共字符串TituloOrigen2{get;set;}
公共列表noConciliadasOrigen1{get;set;}
公共列表noConciliadasOrigen2{get;set;}
}

无法将隐藏输入(或任何表单控件)绑定到复杂对象的集合。如果检查

@Html.HiddenFor(x => x.noConciliadasOrigen1)
大概是

<input type="hidden" name="noConciliadasOrigen1" value="System.Collection.Generic.List[ConciliacionItem]" />
因此,模型绑定失败,属性为
null

如果确实要发布集合中所有属性的所有值,则需要使用
for
循环或
EditorTemplate
for typeof
ConciliacionItem
。但您似乎没有编辑集合的任何属性(事实上,您似乎根本没有从显示的代码中编辑任何内容)因此,不清楚为什么要通过生成大量额外的html来降低性能,并将其全部原封不动地发回。假设您正在编辑某些内容,如果因为
ModelState
无效而需要返回视图,则只需重新填充这些集合即可


您还需要从
BeginForm()中删除
new{listaaconciliarmal=Model}
方法。再次,如果您检查生成的html,您将理解为什么这永远不会起作用。

我最终解决了问题,将其分成几部分:因为我需要发布一个包含所有可用对象的列表,我所做的是:

1) 我创建了3个列表,1个用于发送到视图,2个用于演示。一旦我填写了需要发送到视图的集合,我就填写了另外2个列表,然后将它们传递到视图中的2个ViewBags中

2) 在视图中,我用两个ViewBag的内容填充了部分视图以供显示,但只考虑了“工作”列表


3) 控制器仅接收“工作”信号你能从_listaitemsaconcilermanual-partial视图中发布有用的片段吗,谢谢,我刚刚这么做了。谢谢。嗯,你在视图中做的太多了,他们在做过滤等等。把你的集合从视图模型中分离出来可能是……我必须在这个项目中使用Mvc.Grid,所以我对此没有选择。然而,我发现如果我发送到控制器2列表而不是viewModel,并且在部分视图中我使用标准html而不是所说的网格,我会收到列表。我在询问之前已经这样做了,仍然得到空值。感谢您的输入。我可以尝试,但目的是什么?对不起,我是一个初学者c#OOP.谢谢。将您拥有的模型项ConciliacionManualViewModel替换为我建议的具有构造函数列表初始化功能的模型。这确实说明了问题。非常感谢!
@Html.HiddenFor(x => x.noConciliadasOrigen1)
<input type="hidden" name="noConciliadasOrigen1" value="System.Collection.Generic.List[ConciliacionItem]" />
model.noConciliadasOrigen1 = "System.Collection.Generic.List[ConciliacionItem]";