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

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)

以上是关于尝试将计算值传递给没有控制器的视图的主要内容,如果未能解决你的问题,请参考以下文章

将按钮值从视图传递给控制器​​(codeigniter)

从按钮将值传递给视图控制器字典

如何将值传递给另一个视图控制器?

如何将数据从先前的 segue 传递给子视图控制器?

如何将复杂的键值参数表单视图传递给mvc中的控制器?

我可以将子动作的返回值传递给 ASP.net 中的视图吗