2016-03-13 5 views
0

Я пытаюсь передать значение, которое хранится в одном контроллере к другому, код ниже:Как передать данные из разных контроллеров

Благотворительного Контроллера

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

Прямо сейчас Theres в Squigly красную линию под «благотворительность» в контроллере оплаты с сообщением - оленья кожа существует в текущем контексте. Я просто хотел узнать, можно ли передавать данные с разных контроллеров с использованием временных данных.

+2

С вашим кодом ничего не имеет смысла. Прежде всего, вы даже не указали метод GET для «Платежа», на который вы перенаправляете. И ошибка заключается в том, что в методе POST нет переменной с именем 'charity'. –

ответ

0

Я никогда не пытался сделать это с помощью tempdata. Никогда не нужно. Я рекомендую вам добавить строку с именем благотворительности в модель представления, используемую платежным контроллером.

0

Пожалуйста, исправьте код, как показано ниже, для получения значения из TempData.

charity.DisplayName= TempData["Name"] 
1

Прежде всего, линия return RedirectToAction в методе Пожертвовать собирается отправить 302 ответ на ваш браузер, который будет выдавать запрос GET на URL в месте заголовка ответа, который в данном случае является Payment/Payment. Но ваш метод оплаты отмечен HttpPost. Вы действительно хотите отправить второй запрос GET методу, помеченному HttpPost, чтобы сохранить часть данных (Payment), которую вы хотите сохранить?

Я думаю, вы должны сохранить свою благотворительность и платежные реквизиты в том же методе действия (Создать модель представления PaymentCharity и использовать его вместо того, чтобы использовать атрибут Bind и классы сущностей, созданный EF для transfer data from your view to action method). Кроме того, при использовании TempData для передачи данных, что вы должны сделать, получите уникальный идентификатор сохраненной вами записи платежей, передайте это значение в процессе запроса на второй метод действий и используя идентификатор уникального платежа, снова прочитайте запись о платеже и использовать это.

Так что в вашем методе Пожертвовать,

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

Как уже здесь ответили, самый ответ правильны. Было бы лучше использовать routeValues ​​в методе RedirectToAction для передачи значения от одного действия к другому действию в том же контроллере или другом контроллере.

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

В другом контроллере, данные могут быть получены с помощью

 string displayName = RouteData.Values["id"].ToString(); 

Здесь, в routeValues, вы можете передать весь объект благотворительности, а также и сделать некоторые кастинг в другой контроллер, чтобы получить объект должным образом в том случае, когда вам нужно больше, чем один свойства для отправки:

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

И получить его:

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

Я надеюсь, что вы получите от этого некоторое представление.

 Смежные вопросы

  • Нет связанных вопросов^_^