尝试将计算值传递给没有控制器的视图
Posted
技术标签:
【中文标题】尝试将计算值传递给没有控制器的视图【英文标题】:Trying to pass calculated values to a view without a controller 【发布时间】:2012-07-30 15:02:05 【问题描述】:我正在使用 MvcMailer 并尝试传递计算值。这些值是在用户将信息输入向导表单(文本框、单选按钮列表等)后计算的。对不起,如果这很长,但我想提供尽可能多的上下文以避免“显示更多代码”cmets。我正在使用视图模型 (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】:MVCMailer 邮件程序扩展了 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;
【讨论】:
假设这是正确的(我看到的唯一变化是ViewData.Model = model;
),那么只是在视图中调用@Calculations.CalculationTotalOne
的问题吗?
嗯,应该是@Model.Calculations.CalculationTotalOne,因为您的模型属于 QuoteData 类型,而 Calculations 是 QuoteData 的属性。
是的,这就是我搞砸的地方。做@Model.Calculations.CalculationTotalOne
不起作用。 Cannot convert method group 'TotalOne' to non-delegate type 'object'
是错误。 (请注意,我在第一条评论中搞砸了,它不是“CalculationTotalOne”)。
好的,我明白了!谢谢您的帮助。对最后的评论感到抱歉。
好的,我想我明白发生了什么...如果您的计算类要求您将 QuoteData 传递给 TotalOne 函数,那么也许您可以将 Calculations 类及其方法设为静态。这样,您可以继续将 QuoteData 作为模型传入,在您的视图中,您可以调用 @Calculations.TotalOne(Model)以上是关于尝试将计算值传递给没有控制器的视图的主要内容,如果未能解决你的问题,请参考以下文章