尝试将计算值传递给没有控制器的视图

时间:2012-07-30 15:02:06

标签: c# asp.net-mvc-3 mvcmailer

我正在使用MvcMailer并尝试传递计算值。用户在向导表单(文本框,单选按钮列表等)中输入信息后计算这些值。很抱歉,如果这是冗长的,但我想尽可能多地提供上下文,以避免“显示更多代码”评论。我正在使用视图模型(QuoteData)。我的“价格”保存在模型中(PriceQuote)。

以下是Calculation.cs中的示例计算(以及随附的“总计”代码):

public decimal decOne(QuoteData quoteData)
{
    if (quoteData.Step.RadioButtonOne == Step.EnumOne.ChoiceOne)
            return PriceQuote.priceOne;
    else
        return 0;
}
....
public decimal TotalOne(QuoteData quoteData)
{
    decimal totalOne = PriceQuote.priceBase;
    total += this.decOne(quoteData);
    ....
    return total;
}

我的视图模型是这样的(不确定这是否正确,或者这是否应该进行一些计算):

public class QuoteData
{
    public Calculations Calculations { get; set; }
    ....
}
public QuoteData()
{
Calculations = new Caluclations();
}

之前为模拟目的所做的是把它放在模拟控制器中的一个动作中:

Calculations calc = new Calculations();

var totalone = calc.TotalOne(quoteData);
ViewBag.CalculateTotalOne = totalone;

return View(quoteData);

我在页面中这么称呼它:

@((ViewBag.CalculationTotalOne).ToString("C2"))

同样,这是为了模拟目的。现在,有了MvcMailer我不能做同样的事情,并且整个周末一直在努力弄清楚如何让它发挥作用。我研究过的所有东西都没用。我确信这是一件我忽略的事情。

MvcMailer的视图不使用控制器。它使用了一个类(在我的例子中为QuoteMailer)。以下是我的向导传递给MvcMailer的方式:

public ActionResult Submitted()
{
    QuoteMailer.EMailQuote(quoteData).Send();
    return View(quoteData);
}

EMailQuote中的QuoteMailer

public virtual MailMessage EMailQuote(QuoteData model)
    {
        var mailMessage = new MailMessage { Subject = "..." };

        mailMessage.To.Add(model.Step.EMail);
        mailMessage.To.Add("web@site.com");

        ViewData = new ViewDataDictionary(model);
        PopulateBody(mailMessage, viewName: "EMailQuote");

        return mailMessage;
    }

感谢任何帮助(如何在此处传递计算,而在模拟场景中我使用ViewBag?)

1 个答案:

答案 0 :(得分:1)

MVCMailer Mailers扩展了ControllerBase,因此在一天结束时它们的工作方式与控制器完全相同。您应该能够以与常规控制器相同的方式将数据发送到Mailer视图。 Here是一个链接,描述了您可以将数据发送到Mailer View的所有方式。在您的情况下,您可以执行以下操作以使用强类型模型,只要View期望QuoteData类型的模型:

public virtual MailMessage EMailQuote(QuoteData model)
{
    var mailMessage = new MailMessage { Subject = "..." };

    mailMessage.To.Add(model.Step.EMail);
    mailMessage.To.Add("web@site.com");

    ViewData.Model = model;
    PopulateBody(mailMessage, viewName: "EMailQuote");

    return mailMessage;
}