使用MVC 4进行条件计算

时间:2012-03-14 14:17:35

标签: asp.net-mvc-3 decimal

我试图根据表单中的用户输入有条件地计算一些值。 “输入”本身与计算相关联,因为如果向用户呈现两个单选按钮列表,则他们的选择将确定是否附加了货币量,然后将其加在一起。我不明白jquery,所以我无法弄清楚如何使用像knockout.js这样的东西做我想做的事情(此外,我的计算只会在确认视图中提供,不会被“重新计算”除非用户返回并更改其选择。)

注意,我不是说你有一个文本框接受一个值并将其添加到用户输入的另一个文本框值的场景(例如,用户输入10,然后是10,然后表单计算20)。根据选择,这些值是静态的。

对于上下文,我使用的是Serializer和一个向导,它逐步将模型选择/输入传递给后续视图。

我可以做这样的事情作为一个例子(它很简单,但基于响应,我可以弄清楚如何构建它到我更复杂的场景):

Model.cs:

[DataType(DataType.Currency)]
[DisplayFormat(DataFormatString = "{0:c}")]
public decimal calculated { get; set; }

[DataType(DataType.Currency)]
[DisplayFormat(DataFormatString = "{0:c}")]
public decimal option1 = 500;

[DataType(DataType.Currency)]
[DisplayFormat(DataFormatString = "{0:c}")]
public decimal option2 = 100;

//Following is just my idea to calculate $0 if 
//a selection results in a "no value option"
//although I suppose if nothing is selected I 
//can just avoid calculating + $0
[DataType(DataType.Currency)]
[DisplayFormat(DataFormatString = "{0:c}")]
public decimal nooption = 0;

然后在Confirm.cshtml中:

@{
    Model.calculated = Model.option1 + Model.option2 + Model.nooption;
}
....
@Html.DisplayFor(m => m.calculated)

将显示$600.00。这很容易。

然而, 我的目标是三倍 首先,我需要将option1与来自radiobutton列表的选项绑定,并option2与另一个radiobutton列表绑定,具体取决于用户选择的内容。 第二,取决于我想要有条件地计算所有选项的选择,这些选项显然会根据用户选择而有所不同(某些用户会选择option1option2,其他用户只会{ {1}},其他人只有option1,还有其他人都没有)。 第三,哪里是进行计算的最佳位置(视图,option2文件,控制器(尽管我试图最小化代码)等。) / p>

所以,如果我有radiobutton列表的这些枚举(现在每个选项对应一个选项,稍后我将讨论每个radiobutton list枚举的两个选项):

.cs

我已在public enum radio1 { radio1selection1, // this would correspond to nooption (or $0) radio1selection2 // this would correspond to option1 (or $500) } public enum radio2 { radio2selection1, // this would correspond to nooption (or $0) radio2selection2 // this would correspond to option2 (or $100) } 中指出我希望如何“选择”选项。

我的问题是尝试做enums语句,我无法弄清楚。在if

中有类似的内容
Confirm.cshtml

以上是完全错误的,我知道。我想要考虑计算的所有排列,但我认为它不值得努力,因为它要么是错的要么会起作用但是当有更简单的方法时它会太长。我甚至考虑尝试@{ if (Model.radio1 == radio1selection1) Model.calculated = Model.nooption; else.... } ,但这似乎也是错误的做法。

如果我的case/break选择次数超过两项,那么复杂性增加了,而其他选择会产生多个选项,例如enumsoption1,具体取决于哪个选项用户选择将确定计算。因此枚举成为:

option1a

我想做的其中一件事就是只显示在视图中public enum radio1 { radio1selection1, // this would correspond to nooption (or $0) radio1selection2, // this would correspond to option1 (or $500) radio1selection3 // this would correspond to NEW // option1a (or $750) (with a corresponding // "int" named "option1a") } 中选择的所有选项,这样即使某些东西是0美元的价值,也只会说$ 0作为选项。然后我想我可以添加所有存在的值。但我仍然不知道实现这一目标的最佳方法。

关于我将如何能够和/或所有三个上述目标的任何意见?

2 个答案:

答案 0 :(得分:1)

我会按如下方式定义属性:

[DataType(DataType.Currency)]
[DisplayFormat(DataFormatString = "{0:c}")]
public decimal calculated { get { return option1 + option2 + option3; } }

您可以在getter中根据需要使逻辑成为条件。我认为模型是这些计算的最佳位置,这是我们用计算属性得到的。

要呈现选项集合,请按以下方式定义它们:

public class MyOption
{
    public string ID { get; set; }
    public string Name { get; set; }
}

List<MyOptions> options = new List<MyOptions>();
options.Add(new MyOption { ID = "1", Name = "First" });

model.Options = options;

您可以使用方法而不是Options属性,该属性根据选项*属性的数据返回选项列表。

然后在某个辅助方法中将其转换为SelectList对象。 HTML助手可以定义如下:

public static class MyHelperExtensions
{
    public static SelectList MyOptionList(this HtmlHelper helper, List<MyOptions> options)
    {
         return new SelectList(options, "ID", "Name");
    }
}

在视图中,使用以下代码呈现选项:

@Html.DropDownListFor(x => x.MyOptionProperty, Html.MyOptionList(Model.Options))

答案 1 :(得分:0)

我想出了如何做到这一点(可能不是干净/高效/标准的做法,但它完成了工作):

 Model.calculated =
        Model.PriceQuote.priceChapter7Solution +
        ((Model.radiobuttonlist1 == 
            Namespace.ViewModels.MyModel.radio1.radio1selection1) ?
        Model.option1 :
        (Model.radiobuttonlist1 == 
            Namespace.ViewModels.MyModel.radio1.radio1selection2) ?
        Model.option2 :
        Model.nooption);

我可以在+之后添加... : Model.nooption),而不是使用;结束语句来计算其他选项的条件。

最初我不知道条件(? :)运算符可以包含两个以上的表达式 - 即它是正确关联的,因此附加条件将被评估为a ? b : (c ? d : e)。请参阅Docs