Условные вычисления с MVC4 - PullRequest
1 голос
/ 14 марта 2012

Я пытаюсь условно рассчитать некоторые значения на основе пользовательских данных в форме. Сами «входные данные» связаны с расчетом в том смысле, что если пользователю представлены два списка переключателей, его выбор будет определять, будет ли добавлена ​​сумма в валюте, а затем добавлена ​​вместе. Я не понимаю 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 с выбором из списка радиокнопок и option2 с другим списком радиокнопок в зависимости от того, что выберет пользователь. Второй , в зависимости от выбора. Я хочу условно рассчитать все имеющиеся параметры, которые, очевидно, будут варьироваться в зависимости от выбора пользователя (некоторые пользователи будут выбирать option1 и option2, другие просто option1, другие просто option2, другие тоже нет). Третий , где лучше всего проводить вычисления (представление, файл .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, но это тоже странно кажется неправильным подходом.

Что добавляет мне сложности, так это то, что мои enums имеют более двух вариантов выбора, и эти другие варианты дают несколько вариантов, скажем option1 и 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")
}

Одна из вещей, о которых я подумал, это просто отобразить все опции, выбранные в <table> в представлении, так что даже если что-то имеет значение $ 0, оно просто скажет $ 0 в качестве опции. Тогда я подумал, что могу просто добавить все имеющиеся значения. Но все же я не знаю, как лучше всего это сделать.

Есть ли какие-либо мнения о том, как я смогу и / или все три из моих заявленных целей выше?

Ответы [ 2 ]

1 голос
/ 16 марта 2012

Я бы определил свойство следующим образом:

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

Вы можете сделать логику настолько условной, насколько это необходимо, внутри геттера. Я думаю, что модель - лучшее место для этих вычислений, что мы получаем с вычисляемым свойством.

Чтобы отобразить набор параметров, определите их следующим образом:

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))
0 голосов
/ 23 марта 2012

Я разобрался, как это сделать (возможно, это не чистая / эффективная / стандартная практика, но она выполнила свою работу):

 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). См. Документы .

...