【问题标题】:How to pass data from different controllers如何从不同的控制器传递数据
【发布时间】:2016-03-13 20:31:20
【问题描述】:

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

慈善总监

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

现在在支付控制器的“慈善”下有一条弯曲的红线,其中包含消息 - 在当前上下文中不存在。我只是想知道是否可以使用临时数据从不同的控制器传递数据。

【问题讨论】:

  • 您的代码没有任何意义。首先,您甚至没有显示您重定向到的 Payment 的 GET 方法。而报错是因为POST方法中没有名为charity的变量。

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


【解决方案1】:

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

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

所以在你的捐赠方法中,

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      charity.DisplayName= TempData["Name"]
      

      【讨论】:

        【解决方案4】:

        正如这里已经回答的那样,大多数答案都是正确的。最好在 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"];
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-01-06
          • 2021-04-27
          • 2011-10-03
          • 1970-01-01
          • 2013-10-05
          • 2020-08-08
          • 1970-01-01
          相关资源
          最近更新 更多