我正在尝试传递我的模型列表< 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");
}
}
答案 0 :(得分:3)
你没有传递“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);