7

我正在尝试将我的模型List< Models.Statement > statementList从一个操作传递到另一个操作,但我在第二个控制器中接收到空值。请提出这里有什么问题。甚至尝试过:

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

    }
4

4 回答 4

3

请看 这里以传递您的模型

你没有传递 "statementList" ,而是传递 new { statementList= statementList} 只是传递模型,你应该没问题。

return RedirectToAction("WriteInTemplate", statementList);

西诺的回答

于 2013-09-23T16:01:34.040 回答
1

RedirectToAction()向浏览器写入重定向命令,使其向WriteInTemplate(). 您的模型对象因此丢失。

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

于 2012-01-26T21:07:52.933 回答
1

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

在考虑这一点时..您是否检查过数据不为空?

您正在使用

 return RedirectToAction("WriteInTemplate", statementList );

相反,您应该使用

return RedirectToAction("WriteInTemplate","controllerName", new{"statementList"=stetementList});

在此处查看参考

于 2012-01-30T09:15:12.680 回答
1

您调用 RedirectToAction() 方法的方式可能不是您的问题。

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

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

我遇到了这个问题,所以我创建了一个仅包含表单元素的模型副本,剥离了我的列表并将其传递到 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);
于 2019-08-21T11:42:08.753 回答