C# 在同一控制器中将模型从一个动作传递到另一个动作

C# 在同一控制器中将模型从一个动作传递到另一个动作,c#,asp.net-mvc-3,model-view-controller,asp.net-4.0,asp.net-mvc-3-areas,C#,Asp.net Mvc 3,Model View Controller,Asp.net 4.0,Asp.net Mvc 3 Areas,我试图将我的modelListstatementList从一个动作传递到另一个动作,但我在第二个控制器中接收到空值。请说明这里有什么问题。甚至尝试过: return RedirectToAction("WriteInTemplate", new { statementList = statementList }); 请帮忙 public ActionResult SendPdfStatement(string InvoiceNumber) { try

我试图将我的modelListstatementList从一个动作传递到另一个动作,但我在第二个控制器中接收到空值。请说明这里有什么问题。甚至尝试过:

return RedirectToAction("WriteInTemplate", new { statementList = statementList });
请帮忙

    public ActionResult SendPdfStatement(string InvoiceNumber)
    {
        try
        {
            InvoiceNumber = InvoiceNumber.Trim();

            ObjectParameter[] parameters = new ObjectParameter[1];
            parameters[0] = new ObjectParameter("InvoiceNumber", InvoiceNumber);

            List<Models.Statement> statementList = new List<Models.Statement>();
            statementList = _db.ExecuteFunction<Models.Statement>("uspInvoiceStatement", parameters).ToList<Models.Statement>();

            //WriteInTemplate(statementList);
            return RedirectToAction("WriteInTemplate", statementList );

        }
        catch (Exception e)
        {
            InvoiceSearchTool.Models.udtExceptionTable exception = new udtExceptionTable();
            exception.MethodName = "SendPdfStatement";
            exception.Exception = e.ToString();
            exception.Date = DateTime.Now;
            DYNAMICS_EXTEntities db = new DYNAMICS_EXTEntities();
            db.AddToudtExceptionTables(exception);
            db.SaveChanges();  
            return View("Error");
        }
    }

    public ActionResult WriteInTemplate(List<Models.Statement> statementList)
    {
        try
        {
            string invoiceNumber = statementList.FirstOrDefault().Invoice.ToString().Trim();
        ...................snip..........


            return RedirectToAction("CreateMessageWithAttachment", "email", invoiceNumber); 
        }
        catch (Exception e)
        {
            InvoiceSearchTool.Models.udtExceptionTable exception = new udtExceptionTable();
            exception.MethodName = "WriteInTemplate";
            exception.Exception = e.ToString();
            exception.Date = DateTime.Now;
            DYNAMICS_EXTEntities db = new DYNAMICS_EXTEntities();
            db.AddToudtExceptionTables(exception);
            db.SaveChanges();

            return View("Error");
        }

    }
public ActionResult SendPdfStatement(字符串InvoiceNumber)
{
尝试
{
InvoiceNumber=InvoiceNumber.Trim();
ObjectParameter[]参数=新的ObjectParameter[1];
参数[0]=新的ObjectParameter(“InvoiceNumber”,InvoiceNumber);
List语句List=新列表();
statementList=_db.ExecuteFunction(“USPIvoiceStatement”,参数).ToList();
//WriteInTemplate(语句列表);
返回重定向到操作(“WriteInTemplate”,语句列表);
}
捕获(例外e)
{
InvoiceSearchTool.Models.udtExceptionTable异常=新的udtExceptionTable();
exception.MethodName=“SendPdfStatement”;
exception.exception=e.ToString();
exception.Date=DateTime.Now;
动态扩展db=新的动态扩展();
db.addToudExceptionTables(异常);
db.SaveChanges();
返回视图(“错误”);
}
}
public ActionResult WriteInTemplate(列表语句列表)
{
尝试
{
字符串invoiceNumber=statementList.FirstOrDefault().Invoice.ToString().Trim();
剪
返回RedirectToAction(“CreateMessageWithAttachment”、“email”、invoiceNumber);
}
捕获(例外e)
{
InvoiceSearchTool.Models.udtExceptionTable异常=新的udtExceptionTable();
exception.MethodName=“WriteInTemplate”;
exception.exception=e.ToString();
exception.Date=DateTime.Now;
动态扩展db=新的动态扩展();
db.addToudExceptionTables(异常);
db.SaveChanges();
返回视图(“错误”);
}
}
redirectoaction()
将重定向命令写入浏览器,使浏览器启动一个全新的请求,以
WriteInTemplate()
。因此,您的模型对象将丢失


WriteInTemplate()
是一个独立的操作,有时负责用户的整个请求还是视图的部分请求?如果不是,您应该将其作为常规方法调用,而不是使用
RedirectToAction()

这是因为您指定了错误的路由参数

在考虑这件事的时候。。您是否检查了数据是否不为空

您正在使用

 return RedirectToAction("WriteInTemplate", statementList );
相反,你应该使用

return RedirectToAction("WriteInTemplate","controllerName", new{"statementList"=stetementList});
请看参考资料

您没有传递“statementList”,而是传递新的{statementList=statementList}只要传递模型就可以了

return RedirectToAction("WriteInTemplate", statementList);

用sino回答你调用RedirectToAction()方法的方式可能不是你的问题

对我来说,上面给出的解决方案不起作用,因为RedirectToAction()方法通过使用模型中每个属性的.ToString()值来构建RouteValueDictionary仅当模型中的所有属性都是简单属性时,此操作才有效;如果任何属性都是复杂对象、列表、集合等,则此操作将失败。 因为这个方法不使用递归

例如,如果名为MymodelOrganization的模型包含属性列表Employees,则该属性将导致查询字符串值为 ..&Employees=System.Collections.Generic.List'1[System.String] 绑定会失败,你最终(就像我的情况一样)会。。。空的

我遇到了这个问题,所以我创建了一个只包含表单元素的模型副本,剥离了列表并将其传递到RedirectToAction()中。 一旦使用了另一种操作方法,我就能够重新组合列表,并在调用最后一次返回之前将它们添加到模型中。祝你好运以下是我代码中的想法:

[HttpPost]
public ActionResult ItemSubmissionForm(CombinedModelContent membervalues)
{ ...
    ItemSubmissionsDBFields aFieldsList = membervalues.FieldsList;  //Stripping other objects
    return RedirectToAction("ItemSubmissionConfirm", aFieldsList);
}

[HttpGet]
public ActionResult ItemSubmissionConfirm(ItemSubmissionsDBFields aFieldsList)
{ ...
   List<SomeArea> SomeAreaitems = new List<SomeArea>();
   SomeAreaitems.Add  ...

   CombinedModelContent copymembervalues = new CombinedModelContent();
        copymembervalues.SomeCodeLists = SomeAreaitems;
        copymembervalues.FieldsList = aFieldsList;  
   return View("SomeConfirmPage", copymembervalues);
[HttpPost]
public ActionResult ItemSubmissionForm(组合的ModelContent成员值)
{ ...
ItemSubmissionsDBFields afieldList=membervalues.FieldsList;//剥离其他对象
返回重定向到操作(“ItemSubmissionConfirm”,字段列表);
}
[HttpGet]
公共操作结果ItemSubmitionConfirm(ItemSubmitionsDBFields字段列表)
{ ...
List SomeAreaitems=新列表();
SomeAreaitems。添加。。。
CombinedModelContent copymembervalues=新CombinedModelContent();
copymembervalues.SomeCodeList=SomeAreaitems;
copymembervalues.FieldsList=AfieldList;
返回视图(“SomeConfirmPage”,copymembervalues);

为什么不返回WriteInTemplate(statementList);相反?您可能应该在另一个方法中移动公共功能。@amit_g是正确的。只需“返回WriteInTemplate(statementList);”这也是一个ActionResult,因此它将按预期工作。他说,他在同一个控制器中,因此,他所做的将工作,并使用正确的参数。