在同一个控制器中从一个操作传递模型到另一个操作

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

    }

1
为什么不直接返回WriteInTemplate(statementList)?你应该把通用的功能移到另一个方法中。 - amit_g
@amit_g 是正确的。只需使用 "return WriteInTemplate(statementList);",这也是一个ActionResult,所以它会按预期工作。 - Brent Anderson
4个回答

3
请查看这里以传递您的模型。
您没有传递“statementList”,而是传递了“new {statementList = statementList}”,只需传递模型即可。
return RedirectToAction("WriteInTemplate", statementList);

由sino回答


1

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

在考虑此事时,您是否检查过数据不为空?

您正在使用

 return RedirectToAction("WriteInTemplate", statementList );

你应该使用

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

请参考此处


他说他在同一个控制器中,因此他所拥有的应该可以工作,并且使用了正确的参数。 - Don Thomas Boyle

1

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

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


1
你调用RedirectToAction()方法的方式可能不是问题所在。对我来说,以上提出的解决方案都没有起作用,因为RedirectToAction()方法使用模型中每个属性的.ToString()值构建RouteValueDictionary。这只适用于所有模型属性都是简单属性的情况,如果有任何属性是复杂对象、列表、集合等,则会失败,因为此方法不使用递归。例如,如果一个名为MymodelOrganization的模型包含一个List Employees属性,则该属性将导致查询字符串值为....&Employees=System.Collections.Generic.List'1[System.String],绑定将失败,你最终会得到null(就像我的情况一样)。我遇到了这个问题,所以我创建了一个仅包含表单元素的模型副本,去除了我的Lists,并将其传递给RedirectToAction()。一旦进入其他操作方法,我就能够重新组装我的Lists并在调用最后返回之前将它们添加到我的模型中。祝好运。以下是我的代码思路:
[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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接