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

C# 尝试将计算值传递到没有控制器的视图,c#,asp.net-mvc-3,mvcmailer,C#,Asp.net Mvc 3,Mvcmailer,我正在使用MvcMailer并尝试传递计算值。这些值是在用户将信息输入向导表单(文本框、单选按钮列表等)后计算的。抱歉,如果这是冗长的,但我想提供尽可能多的上下文,以避免“显示更多代码”的评论。我使用的是视图模型(QuoteData)。我的“价格”保存在模型中(PriceQuote) 以下是mycalculation.cs中的计算示例(以及附带的“总计”代码): public decimal decOne(QuoteData quoteData) { if (quoteData.Step

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

以下是my
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;
}
我的视图模型是这样的(不确定这是否正确,或者这是否是我应该进行一些计算的地方):

我以前为模拟目的所做的是在模拟控制器中的一个动作中:

Calculations calc = new Calculations();

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

return View(quoteData);
我在页面上这样称呼它:

@((ViewBag.CalculationTotalOne).ToString("C2"))
同样,这是出于模拟的目的。现在,有了MvcMailer,我不能做同样的事情,整个周末我都在努力想如何让它工作。我所研究和尝试的一切都不起作用。我相信这是我忽略了的一件简单的事情

MvcMailer的视图不使用控制器。它使用一个类(
quoteEmailer
,在我的例子中)。以下是我的向导如何传递给MvcMailer:

public ActionResult Submitted()
{
    QuoteMailer.EMailQuote(quoteData).Send();
    return View(quoteData);
}
以下是
quot电子邮件发送程序
中的
EMailQuote

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
?)

MVCMailer邮件程序扩展了ControllerBase,因此在一天结束时,它们的工作方式与控制器完全相同。您应该能够以与常规控制器相同的方式将数据发送到邮件视图。是一个链接,描述了将数据发送到Mailer视图的所有方式。在您的情况下,只要视图希望使用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;
}

假设这是正确的(我看到的唯一变化是
ViewData.Model=Model;
),那么这只是在视图中调用
@Calculations.CalculationTotalOne
的问题吗?它应该是@Model.Calculations.CalculationTotalOne,因为您的模型是QuoteData类型,而计算是QuoteData的属性。是的,这就是我被搞砸的地方。执行
@Model.Calculations.CalculationTotalOne
无效<代码>无法将方法组“TotalOne”转换为非委托类型“object”
是错误。(注意,我在第一次评论中把事情搞砸了,不是“CalculationTotalOne”)。好吧,我明白了!谢谢你的帮助。很抱歉最后的评论。好的,我想我理解发生了什么…如果您的计算类要求您将QuoteData传递给TotalOne函数,那么您可以使计算类及其方法保持静态。这样,您可以继续将QuoteData作为您的模型传递,并在视图中调用@Calculations.TotalOne(模型)
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;
}