如何从不同的控制器传递数据

时间:2016-03-13 20:31:21

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

我正在尝试将存储在一个控制器中的值传递给另一个控制器,代码如下:

慈善机构管理员

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Donate([Bind(Include = "ID,DisplayName,Date,Amount,Comment")] Charity charity)
    {

        if (ModelState.IsValid)
        {
            if (!string.IsNullOrEmpty(charity.Comment))
            {
                var comment = charity.Comment.ToLower().Replace("hot", "###").Replace("cold", "###").Replace("Slow", "###").Replace("enjoy", "###").Replace("BAD", "###");
                charity.Comment = comment;  //Replaces textx from model variable - comment

                charity.TaxBonus = 0.20 * charity.Amount;


            }

            if (string.IsNullOrEmpty(charity.DisplayName))
            {
                charity.DisplayName = "Annonymus"; //If user doesnt enter name then Annonymus

            }
             db.Donations.Add(charity);
            db.SaveChanges();
            TempData["Name"] = charity.DisplayName;
            TempData["Amount"] = charity.Amount;
            TempData["Comment"] = charity.Comment;
            return RedirectToAction("../Payments/Payment", "Charities", new { id = charity.Amount });
        }
        return View(charity);
    }

慈善组

 public class Charity
{
    public int ID { get; set; }
    [RegularExpression(@"^[a-zA-Z]+$", ErrorMessage = "Use letters only please")]
    public string DisplayName { get; set; }

    [DataType(DataType.Currency)]
    [Range(2, Int32.MaxValue, ErrorMessage = "Atleast £2.00 or a whole number please")]
    public int Amount { get; set; }
    [DataType(DataType.Currency)]
    public Double TaxBonus { get; set; }
    public String Comment { get; set; }
    public static object Information { get; internal set; }
}

付款控制器

      [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Payment([Bind(Include = "ID,CardName,CardNumber,ValidFrom,Expires,CardSecurityCode,EmailAddress,ConfrimEmailAddress,Address,City,Country,PostCode")] Payment payment)
    {
        if (ModelState.IsValid)
        {
            db.Payments.Add(payment);
            db.SaveChanges();
            TempData["Name"] = charity.DisplayName
            TempData["Amount"];
             TempData["Comment"];
            TempData["Name"] = payment.CardName;
            TempData["Email"] = payment.EmailAddress;
            return RedirectToAction("Confirmation", "Payments", new { id = payment.ID });
        }

        return View(payment);

    }

付款类

public class Payment
{
   public int ID { get; set; }
 }
public class CharityDBContext : DbContext //controls information in database 
{
    public DbSet<Charity> Donations { get; set; } //creates a donation database

}

public class PaymentDBContext : DbContext //controls information in database 
{
    public DbSet<Payment> Payments { get; set; } //creates a donation database

    public System.Data.Entity.DbSet<CharitySite.Models.Charity> Charities { get; set; }
}

}

我想从慈善机构控制器

获取此信息
TempData["Name"] = charity.DisplayName;

在付款控制器中显示

 TempData["Name"] = charity.DisplayName;

现在支付控制器中的“慈善机构”下面有一条红色线条,带有消息 - 在当前情况下不存在。我只是想知道是否可以使用临时数据从不同的控制器传递数据。

4 个答案:

答案 0 :(得分:1)

首先,Donate方法中的行return RedirectToAction将向您的浏览器发送302响应,该响应将向响应的位置标题中的url发出GET请求,在本例中为Payment/Payment。但您的付款方式标有HttpPost。您确定要向标有HttpPost的方法发送第二个GET请求,以保存您要保存的部分数据(Payment)吗?

我认为您应该使用相同的操作方法保存您的慈善机构和付款信息(创建一个PaymentCharity视图模型并使用它而不是使用Bind属性和EF创建的实体类transfer data from your view to action method < / em>的)。此外,insteaof使用TempData传递数据,您应该做的是,获取您保存的付款记录的唯一ID,将其以查询字符串传递给第二个操作方法,并使用唯一的付款ID,再次阅读付款记录,用那个。

所以在你的Donate方法中,

public ActionResult Donate(PaymentCharirtVm model)
{
   var charity = new Charity { DisplayName =model.Amount,Comment =model.Comment};
   var payment = new Payment ();
   //set the properties of payment here

   db.Donations.Add(charity);
   db.SaveChanges();
   //now save Payment
   db.Payment.Add(payment);
   db.SaveChanges();
   return RedirectToAction("Confirmation","Payment", new { id=payment.Id });
}

答案 1 :(得分:0)

我从未尝试过使用tempdata。从来没有需要。我建议您将具有慈善机构名称的字符串添加到付款控制器使用的视图模型中。

答案 2 :(得分:0)

请更正以下代码以从TempData中检索值。

charity.DisplayName= TempData["Name"]

答案 3 :(得分:0)

如前所述,大多数答案都是正确的。最好在RedirectToAction方法中使用routeValues将值从一个操作传递到同一个控制器或另一个控制器中的另一个操作。

        return RedirectToAction("actionName", "anotherControllerName", new { id = charity.DisplayName });

在另一个控制器中,可以通过

检索数据
        string displayName = RouteData.Values["id"].ToString();

在这里,在routeValues中,您可以传递整个Charity对象,并在另一个控制器中进行一些转换,以便在需要发送多个属性时正确地获取对象:

        return RedirectToAction("actionName", "anotherControllerName", new { id = charity });

得到它:

        Charity chatiry = (Charity)RouteData.Values["id"];

我希望你能从中得到一些想法。