pass model from one action to another action in same controller

删除回忆录丶 提交于 2020-01-03 09:04:39

问题


I am trying to pass my model List< Models.Statement > statementList from one action to another but i am receiving null value in the 2nd controller. Please suggest what is wrong here. Even tried with:

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

Please help.

    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:


Please take a look here to pass your Model

you are not passing "statementList" , instead you are passing new { statementList= statementList} just pass the model and you should be fine .

return RedirectToAction("WriteInTemplate", statementList);

Answer by sino




回答2:


RedirectToAction() writes a redirect command to the browser, making it start a brand new request to WriteInTemplate(). Your model object is therefore lost.

Is WriteInTemplate() an independent action which will sometimes be responsible for an entire request from a user or a partial request from a view? If not, you should just call it as a regular method instead of using RedirectToAction().




回答3:


This is because you had spefified wrong route parameters.

while thinking about this.. did you check that the data are not null?

you are using

 return RedirectToAction("WriteInTemplate", statementList );

instead you should use

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

see reference here




回答4:


The way you call the RedirectToAction() method may not be your issue.

For me, the solutions presented above did not work because the RedirectToAction() method builds a RouteValueDictionary by using the .ToString() value of each property in the model. This will only work if all the properties in the model are simple properties and it fails if any properties are complex objects, lists, collections, etc. because this method does not use recursion.

If for example, a model called MymodelOrganization contained a property List Employees, then that property would result in a query string value of ....&Employees=System.Collections.Generic.List'1[System.String] and binding would fail, and you would end up (as was my case) with ... null

I had this problem, so I created a copy of my model containing only the elements of the form, stripping my Lists and passed that inside RedirectToAction(). Once on the other action method, I was able to re-assemble my Lists and added them to my Model before calling the last return. Good luck. Here is the idea in my code:

[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);


来源:https://stackoverflow.com/questions/9024693/pass-model-from-one-action-to-another-action-in-same-controller

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!