ASP.Net Core处理产品价格

时间:2017-08-24 02:11:28

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

我有一个相当简单的问题,但我不太清楚如何解释它是什么我试图这样做我将从一些代码开始:

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的细节。

2 个答案:

答案 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'];

理论上,这可行,但这是不好的做法。我建议使用视图模型传递数据。基本上,您在其上创建了另一个包含ProductDescription的类,为其指定一个值,并在重定向时将其传递给它。然后,将其作为视图模型传递,并在该视图上使用该模型。这样,你就会遵循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();
    }