【问题标题】:Passing data between two ActionResults in the same controller rendering different views in asp.net mvc在 asp.net mvc 中呈现不同视图的同一控制器中的两个 ActionResults 之间传递数据
【发布时间】:2017-04-17 02:49:52
【问题描述】:

我必须将 iddemande 从一个 ActionResult 传递到同一个控制器中的另一个,但由于每个 ActionResult 呈现不同的视图,因此 TempData 或 Session 失败。 所以我需要你的帮助来了解如何在这两个控制器之间传递数据,从“Details”到“Sortie”。

我的控制器:

    public ActionResult Details(int? num,int iddemande)
        {
            TempData["num"] = num;
            //Session["iddemande"] = iddemande;
            TempData["iddemande"] = iddemande;
            if (num == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            var listdemandes = (from d in db.Demande_Gabarit
                                join g in db.Gabarits
                                    on d.idPoste equals g.idPoste into ThisList
                                from g in ThisList.DefaultIfEmpty()
                                select new
                                {
                                    NumDemande = d.NumDemande,
                                    Emetteur = d.Emetteur,
                                    Date = d.Date,
                                    Quantite = d.Quantite,
                                    Designation = g.DesignationGabarit,
                                    Produit=d.Postes.Produits.Reference,
                                    Ligne = d.Ligne.designation
                                }).ToList().Select(x => new DemandeViewModel()
                                {
                                    NumDemande = x.NumDemande,
                                    Emetteur = x.Emetteur,
                                    Date = x.Date,
                                    Quantite = x.Quantite,
                                    DesignationGabarit = x.Designation,
                                    designation = x.Ligne,
                                    Reference= (int)x.Produit
                                }).Where(x => x.NumDemande == num);


            return View(listdemandes.DistinctBy(x=>x.DesignationGabarit));

        }
//Get Sortie
        public ActionResult Sortie(Int64 id)
        {
             TempData["codebarre"] = id;

            return View();

        }
        //Post Sortie
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Sortie(DemandeViewModel postData)
        {
            Int64 cb = postData.CodeBarre;

            var mvtrepository = new MvtRepository(db);
            var gabaritrepository = new GabaritRepository(db);





            if (Convert.ToInt64(TempData["codebarre"]) == cb)
            {
                var mvtInsert = mvtrepository.InsertMvt(DateTime.Now, Convert.ToInt64(TempData["codebarre"]), 2);
                var idDemande = Convert.ToInt32(TempData["iddemande"]);
                Demande_Gabarit demande =
                    demanderepository.Get(x => x.id_demande == idDemande).SingleOrDefault();

                demande.QtLivree = 1;
                demanderepository.Update(demande);

                return RedirectToAction("Details");
            }


            else
            {
                return View("Error");
            }

        }

【问题讨论】:

  • 哪里不工作(具体方法/线路)?您的预期行为是什么?会话应该可以工作。
  • 感谢您的快速回复。对我来说不起作用的是 ActionResult"Sortie" 中的 iddemande 为空
  • @Shyju 我编辑了我的问题..我的意思是在同一个控制器中的两个 actionResults 之间
  • 您的意思是,在您的 GET 和 POST 操作方法之间?为什么你认为它不起作用? TempData["codebarre"] 在您的 HttpPost 操作方法中是否为空?
  • @oumaima 会话不工作?您是否尝试使用 session 而不是 TempData?

标签: c# asp.net asp.net-mvc


【解决方案1】:

TempData 值仅对下一个请求可用。这意味着,如果您为 Details 操作设置了一些值,并且接下来导航到 Sortie GET 操作,您将能够检索它。但是,如果您提交表单并点击 Sortie HTTPPost 操作,它将不可用。

一种选择是再次设置 tempdata 值,以便在下一个请求中也可以访问它。

public ActionResult Sortie(Int64 id)
{       
    TempData["codebarre"] = id; 
    var t = TempData["iddemande"];
    TempData["iddemande"] = t;
    return View();
}

另一个选项(更好/更干净的选项恕我直言)是通过您的表单传递此值。因此,您无需在 GET 操作中再次设置 TempData,而是将此 TempData 值保存在表单元素中,当提交表单时,该值将发送到您的 HttpPost 操作方法。您可以在您的操作方法中添加一个参数来读取此内容。

所以在你的突击查看表单中,

@using (Html.BeginForm())
{
    <input type="text" value="@TempData["iddemande"]" name="iddemande" />
    <input type="submit" value="submit" />
}

在您的 http post 操作中

[HttpPost]        
public ActionResult Sortie(DemandeViewModel postData,int iddemande)
{
   // You can use the value of iddemande
   // to do  : Return something
}

关于会话,只要您正确阅读它,它就应该可以工作。会话值设置后将可用于所有请求,直到会话结束。

【讨论】:

  • 非常感谢,正确使用 Session 对我有用..谢谢..你保存了“我的代码”^^
猜你喜欢
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 2021-02-04
  • 2017-09-19
  • 2015-06-16
相关资源
最近更新 更多