我有一个相当简单的问题,但我不太清楚如何解释它是什么我试图这样做我将从一些代码开始:
public IActionResult Charge(string stripeEmail, string stripeToken)
{
ViewData["Price"] = Price;
ViewData["Description"] = Description;
if (StripeHelpers.ChargeCustomer(stripeEmail, stripeToken, Price, Description))
return RedirectToAction("Success");
return RedirectToAction("Failure");
}
public IActionResult Success()
{
ViewData["Price"] = Price;
ViewData["Description"] = Description;
return View();
}
public IActionResult Failure()
{
ViewData["Price"] = Price;
ViewData["Description"] = Description;
return View();
}
这是我的产品页面的控制器,我想找到为每个操作设置ViewData的替代方法,因为它在控制器中基本上是一个设置价格和交易描述的常量。
是否有更好,更可重复使用的解决方案?最好是我可以添加一个单行程序给我的控制器,以自动将信息注入其所有视图中。
当然,在这种情况下,我可以不使用这些具体数据,但我相信我将来会遇到类似的问题,而且我很想学习ASP.Net Core的细节。
答案 0 :(得分:1)
您每次需要设置ViewData
的原因是因为您正在重定向。重定向使ViewData
值为空。这主要是因为它只是视图和控制器进行通信的一种机制。
您可以使用TempData
来处理它。 TempData
应该能够将数据从一个操作传递到另一个操作。注意:TempData最多只能存在一次。
你的例子:
public IActionResult Charge(string stripeEmail, string stripeToken)
{
TempData["Price"] = Price;
TempData["Description"] = Description;
if (StripeHelpers.ChargeCustomer(stripeEmail, stripeToken, Price, Description))
return RedirectToAction("Success");
return RedirectToAction("Failure");
}
public IActionResult Success()
{
return View();
}
public IActionResult Failure()
{
return View();
}
您可以使用TempData
访问视图中的数据,只需将其打包即可。
var price = (int)TempData['Price'];
理论上,这可行,但这是不好的做法。我建议使用视图模型传递数据。基本上,您在其上创建了另一个包含Product
和Description
的类,为其指定一个值,并在重定向时将其传递给它。然后,将其作为视图模型传递,并在该视图上使用该模型。这样,你就会遵循MVC的模式。
希望这有帮助。
答案 1 :(得分:0)
这是适合您的可重用解决方案: 创建一个私有方法,它将返回价格和描述ViewData。然后在你的动作方法中调用它。
private void ReturnPriceAndDescription()
{
ViewData["Price"] = Price;
ViewData["Description"] = Description;
}
public IActionResult Charge(string stripeEmail, string stripeToken)
{
ReturnPriceAndDescription();
if (StripeHelpers.ChargeCustomer(stripeEmail, stripeToken, Price, Description))
return RedirectToAction("Success");
return RedirectToAction("Failure");
}
public IActionResult Success()
{
ReturnPriceAndDescription();
return View();
}
public IActionResult Failure()
{
ReturnPriceAndDescription();
return View();
}