Десятичные значения с тысячей разделителя у Asp. Сетевой MVC

БЫСТРОЕ РЕШЕНИЕ:

Решение, если вы хотите повлиять на фактический элемент .ui.

.ui-state-active a, .ui-state-hover a {
    outline: none;
}

В чем разница между ответом Анона и Константина Д.

Анон справедливо нацелился на фактический «тег» внутри «тега li». Всегда помните, что вкладки (); использует теги внутри несортированного списка. Чтобы на самом деле отображать вкладки навигации.

ПРИМЕР:

CSS также влияет на контур li: a теги

.ui-state-active a, .ui-state-hover a {
    outline: none;
}

Запускает виджет вкладок пользовательского интерфейса jQuery

$('#my-tabs').tabs();

Разметка вкладок в HTML

<div id="my-tabs">
    <ul>
        <li><a href="#tab-1">Tab 1</a></li>
        <li><a href="#tab-2">Tab 1</a></li>
    </ul>
    <div id="tab-1"></div>
    <div id="tab-2"></div>
</div>
13
задан Funka 5 November 2018 в 23:28
поделиться

5 ответов

Кажется, всегда можно найти обходные пути в той или иной форме, чтобы сделать стандартную привязку модели по умолчанию! Интересно, можно ли создать «псевдо» свойство, которое используется только связывателем модели? (Обратите внимание, это ни в коем случае не изящно. Мне кажется, что я прибегаю к подобным уловкам все чаще и чаще просто потому, что они работают и выполняют свою работу ...) Также обратите внимание, если вы использовали отдельный "ViewModel" (который я рекомендую для этого), вы можете поместить туда этот код и оставить свою модель предметной области красивой и чистой.

public class Employee
{
    private decimal _Salary;
    public string MvcSalary // yes, a string. Bind your form values to this!
    {
        get { return _Salary.ToString(); }
        set
        { 
            // (Using some pseudo-code here in this pseudo-property!)
            if (AppearsToBeValidDecimal(value)) {
                _Salary = StripCommas(value);
            }
        }
    }
    public decimal Salary
    {
        get { return _Salary; }
        set { _Salary = value; }
    }
}

PS, после того, как я напечатал это, я оглядываюсь на это сейчас и даже не решаюсь опубликуйте это, это так некрасиво! Но если вы думаете, что это может быть полезно, я позволю вам решить ...

Удачи!
-Майк

4
ответ дан 1 December 2019 в 21:25
поделиться

Причина в том, что в ConvertSimpleType в ValueProviderResult.cs используется TypeConverter.

TypeConverter для десятичного числа не поддерживает разделитель тысяч. Об этом читайте здесь: http://social.msdn.microsoft.com/forums/en-US/clr/thread/1c444dac-5d08-487d-9369-666d1b21706e

Пока не проверял, но на в том сообщении они даже сказали, что CultureInfo, переданный в TypeConverter, не используется. Он всегда будет неизменным.

           string decValue = "1,400.23";

        TypeConverter converter = TypeDescriptor.GetConverter(typeof(decimal));
        object convertedValue = converter.ConvertFrom(null /* context */, CultureInfo.InvariantCulture, decValue);

Так что я думаю, вам нужно использовать обходной путь. Неприятно ...

15
ответ дан 1 December 2019 в 21:25
поделиться

Эй, у меня возникла еще одна мысль ... Это основано на ответе Навида, но по-прежнему позволит вам использовать привязку модели по умолчанию. Идея состоит в том, чтобы перехватить опубликованную форму, изменить некоторые из значений в ней, а затем передать коллекцию [измененных] форм методу UpdateModel (привязка модели по умолчанию) ... Я использую модифицированную версию для , имеющую дело с checkboxes / booleans , чтобы избежать ситуации, когда что-либо, кроме «true» или «false», вызывает необработанное / тихое исключение в связывателе модели.

(Вы, конечно, захотите реорганизовать это, чтобы оно было более ре- все десятичные дроби)

public ActionResult myAction(NameValueCollection nvc)
{
    Employee employee = new Employee();
    string salary = nvc.Get("Salary");
    if (AppearsToBeValidDecimal(salary)) {
        nvc.Remove("Salary");
        nvc.Add("Salary", StripCommas(salary));
    }
    if (TryUpdateModel(employee, nvc)) {
        // ...
    }
}

PS, я могу запутаться в моих методах NVC, но я думаю, что они будут работать.

0
ответ дан 1 December 2019 в 21:25
поделиться

Вы пытались преобразовать его в десятичный формат в контроллере? Это должно помочь:

string _val = "1,000.00"; Десятичный _decVal = Convert.ToDecimal (_val); Console.WriteLine (_decVal.ToString ());

0
ответ дан 1 December 2019 в 21:25
поделиться

Мне не понравились приведенные выше решения, и я пришел к следующему:

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

        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if(bindingContext.ModelType == typeof(decimal) || bindingContext.ModelType==typeof(Nullable<decimal>))
        {
            ValueProviderResult valueProviderResult = bindingContext.ValueProvider[bindingContext.ModelName];
            if (valueProviderResult != null)
            {
                decimal result;
                var array = valueProviderResult.RawValue as Array;
                object value;
                if (array != null && array.Length > 0)
                {
                    value = array.GetValue(0);
                    if (decimal.TryParse(value.ToString(), out result))
                    {
                        string val = result.ToString(CultureInfo.InvariantCulture.NumberFormat);
                        array.SetValue(val, 0);
                    }
                }
            }
        }
        return base.BindModel(controllerContext, bindingContext);
    }
7
ответ дан 1 December 2019 в 21:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: