среда, 17 декабря 2014 г.

Html.DevExpress().TextBox - привязка к полю Number

Окружение

VS 2013 , Developer Express компоненты DXperience 14.1.8

Проблема

Возникла проблема с полем в БД с именем "Number", точнее, с отображением его в виде текстбокса.



@Html.DevExpress().TextBox(
                settings =>
                {
                    settings.Name = "Number";
                    ...

Разрабатываю веб-приложение на DevExpress компоеннтах.
В базе данных сделал у документа поле с именем Number (номер документа).

Работа с БД через EntityFramework.

Делаю форму редактирования документа.
Поле хочу отобразить девэкспрессовским текстбоксом, естественно привязанным к полю в БД. Как только вставлю на страницу такой код

@Html.DevExpress().TextBox(
                settings =>
                {
                    settings.Name = "DocNumber";
                    settings.ControlStyle.CssClass = "editor";
                }
         ).Bind(Model.DocNumber).GetHtml()



страница валится.
Методом проб и ошибок пришел к тому, что если переименовать поле в БД на какое-либо другое имя, например Num, то все начинает работать нормально.

Но, согласитесь, коробит, когда приходится из-за веб-компонетов вносить какие-то изменения в БД.

Гугление вывело на статью поддержки
https://www.devexpress.com/Support/Center/Question/Details/KA20013

Из которой стало понятно, что Number перекрыватеся с типом JavaScript

Соответственно, не рекомендуют называть DevExpress компоненты именами типа
  String
 Number
 Boolean
 Object
 Date
 Array
 Undefined
 Null
 etc.


Решение

Переименовывать поле в БД не хотелось, соответственно я пришел к компромиссному решению: расширил модель документа, а именно добавил в неё обверточное поле.

Конкретная реализация - через добавление партиал класса

public partial class DocMenu
    {

        /// <summary>
        /// поле-обвертка для стандартных DevExpress Web компонентов,
        /// </summary>
        public int DocNumber
        {
            get { return Number; }
            set { Number = value; }

        }

    }

Мне это показалось достаточным компромиссом, хотя, возможно аналогичное решение можно сделать и через наследование.

Комментариев нет:

Отправить комментарий