Могу ли я заставить помощник Razor TextBoxFor использовать специальный десятичный разделитель c, а не по умолчанию? - PullRequest
0 голосов
/ 26 мая 2020

У меня следующая разметка:

@Html.TextBoxFor(m => m.Items[i].Rate, new { @class = "form-control text-center Rate", @readonly = Model.PreTenderLockedDown, title = "Rate" })

Когда свойство Rate, например, 12,45 в db, приведенное выше TextBoxFor отображает число с разделителем-запятой, а не период, который я хочу. Могу ли я сделать что-нибудь помимо установки языковых настроек в IIS?

Ответы [ 3 ]

0 голосов
/ 31 августа 2020

Использование регулярного выражения будет вариантом, если вас не интересует чрезмерная инженерия. Пример кода, как показано ниже, будет работать. Я не тестировал код , это просто для иллюстрации.

@Html.TextBoxFor(m => Regex.Replace(m.Items[i].Rate.ToString(), @",(?<=\d,)(?=\d)", "."), new { @class = "form-control text-center Rate", @readonly = Model.PreTenderLockedDown, title = "Rate" })

{ ссылка } используйте регулярное выражение отсюда, если возможно.

0 голосов
/ 03 сентября 2020

Вы можете использовать атрибут «Value» разметки TextBoxFor.

@Html.TextBoxFor(m => m.Items[i].Rate, new { @class = "form-control text-center Rate", @readonly = Model.PreTenderLockedDown, title = "Rate", Value=String.Format("{0:0.###}", m.Items[i].Rate)  })

Здесь «{0: 0. ###}» означает, что он будет отображать 3 цифры под десятичными точками.

0 голосов
/ 26 мая 2020

Попробуйте следующее:

web.config:

<system.web>
  <globalization culture="en-US" uiCulture="en-US" />
</system.web>

Вы также можете применить это для представления, в котором вы хотите принудительно этот параметр:

<%@ Page="" UICulture="en-US" Culture="en-US" %>

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

Вспомогательный метод:

public static class MyHelpers
{
    //Custom HTML Helper method used for setting "class" and disabled attributes of MyDropdownlist
    public class MySelectItem : SelectListItem
    {
        /* Since you are passing this data using ViewData, you don't have a limitation and 
        you can put anything there. I advise that you use ViewBag instead of ViewData. */
        public string Class { get; set; } 
        public string Disabled { get; set; }
    }

    public static MvcHtmlString MyDropdownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<MySelectItem> list, string optionLabel, object htmlAttributes)
    {
        return MyDropdownList(htmlHelper, ExpressionHelper.GetExpressionText(expression), list, optionLabel, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
    }

    public static MvcHtmlString MyDropdownList(this HtmlHelper htmlHelper, string name, IEnumerable<MySelectItem> list, string optionLabel, IDictionary<string, object> htmlAttributes)
    {
        TagBuilder dropdown = new TagBuilder("select");
        dropdown.Attributes.Add("name", name);
        dropdown.Attributes.Add("id", name);
        StringBuilder options = new StringBuilder();

        // Make optionLabel the first item that gets rendered.
        if (optionLabel != null)
            options = options.Append("<option value='" + String.Empty + "'>" + optionLabel + "</option>");

        foreach (var item in list)
        {
            if(item.Disabled == "disabled")
                options = options.Append("<option value='" + item.Value + "' class='" + item.Class + "' disabled='" + item.Disabled + "'>" + item.Text + "</option>");
            else
                options = options.Append("<option value='" + item.Value + "' class='" + item.Class + "'>" + item.Text + "</option>");
        }
        dropdown.InnerHtml = options.ToString();
        dropdown.MergeAttributes(new RouteValueDictionary(htmlAttributes));
        return MvcHtmlString.Create(dropdown.ToString(TagRenderMode.Normal));
    }
}
...