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

时间:2012-01-26 20:16:20

标签: c# asp.net-mvc-3 model-view-controller asp.net-4.0 asp.net-mvc-3-areas

我正在尝试传递我的模型列表< 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 个答案:

答案 0 :(得分:3)

请查看here to pass your Model

你没有传递“statementList”,而是传递新的{statementList = statementList}只是传递模型,你应该没事。

return RedirectToAction("WriteInTemplate", statementList);

通过sino回答

答案 1 :(得分:1)

RedirectToAction()向浏览器写入重定向命令,使其向WriteInTemplate()发起全新请求。因此,您的模型对象将丢失。

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

答案 2 :(得分:1)

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

在考虑这个问题时..你确定数据不是空的吗?

您正在使用

 return RedirectToAction("WriteInTemplate", statementList );

相反,你应该使用

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

参见参考here

答案 3 :(得分:0)

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

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

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

我遇到了这个问题,所以我创建了一个仅包含表单元素的模型副本,剥离了Lists并将其传递到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);