Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Расширение стандартного MVC биндера / 25 сообщений из 93, страница 1 из 4
05.07.2013, 11:38
    #38321624
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
Очень не хватает возможности программировать биндеры и вешать атрибутом на проперти. Найдено вот такое решение:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
    public class MyDefaultModelBinder : System.Web.Mvc.DefaultModelBinder
    {
        protected override void BindProperty(
            ControllerContext controllerContext, 
            ModelBindingContext bindingContext, 
            PropertyDescriptor propertyDescriptor)
        {
            var propertyBinderAttribute = TryFindPropertyBinderAttribute(propertyDescriptor);
            if (propertyBinderAttribute != null)
            {
                var binder = CreateBinder(propertyBinderAttribute);
                var value = binder.BindModel(controllerContext, bindingContext, propertyDescriptor);
                propertyDescriptor.SetValue(bindingContext.Model, value);
            }
            else
            {
                base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
            }
        }

        IPropertyBinder CreateBinder(PropertyBinderAttribute propertyBinderAttribute)
        {
            return (IPropertyBinder)DependencyResolver.Current.GetService(propertyBinderAttribute.BinderType);
        }

        PropertyBinderAttribute TryFindPropertyBinderAttribute(PropertyDescriptor propertyDescriptor)
        {
            return propertyDescriptor.Attributes
              .OfType<PropertyBinderAttribute>()
              .FirstOrDefault();
        }
    }

    interface IPropertyBinder
    {
        object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext, MemberDescriptor memberDescriptor);
    }

    public class PropertyBinderAttribute : Attribute
    {
        public PropertyBinderAttribute(Type binderType)
        {
            BinderType = binderType;
        }

        public Type BinderType { get; private set; }
    }



пример использования:

Код: c#
1.
2.
3.
4.
5.
    public class MyModel
    {
        [PropertyBinder(typeof(MyEnumFlagsBinder))] // class MyBider: IPropertyBinder
        public MyFlagsEnum EnumFlags { get; set; }
    }



решение неплохое и работает. и DI поддерживает. красотень. не хотите покритиковать?
...
Рейтинг: 0 / 0
05.07.2013, 12:27
    #38321717
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
hVosttОчень не хватает возможности программировать биндеры и вешать атрибутом на проперти.
Особых сложностей не испытываю.
...
Рейтинг: 0 / 0
05.07.2013, 12:41
    #38321733
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
МСУ,

а по существу? как вот это забиндешь:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
[Flags]
enum MyEnum {

   [Display(AutoGenerateField = false)]
   None = 0,
   
   [Display(Name = "The Option 1")]
   Option1 = 1 << 0,
   [Display(Name = "The Option 2")]
   Option2 = 1 << 1,
   [Display(Name = "The Option 3")]
   Option3 = 1 << 2

}
...
Рейтинг: 0 / 0
05.07.2013, 12:57
    #38321760
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
...
Рейтинг: 0 / 0
05.07.2013, 13:01
    #38321767
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
МСУ,

мдяааа... я сомневаюсь, что на твоём ресурсе найдется рецептик по работе с енумом с флагами — принципиальная разница в том, что рендерится не дропдаун там или радиобатоны, а мультиселектлист/чекбокслист, ну или что-то вроде того. т.е. допускается множественный выбор, это ж флаги ёмыть.

повторю еще раз вопрос. как забиндешь?
...
Рейтинг: 0 / 0
05.07.2013, 13:06
    #38321775
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
hVosttМСУ, мдяааа... я сомневаюсь, что на твоём ресурсе найдется рецептик по работе с енумом с флагами — принципиальная разница в том, что рендерится не дропдаун там или радиобатоны, а мультиселектлист/чекбокслист, ну или что-то вроде того. т.е. допускается множественный выбор, это ж флаги ёмыть.
Принцип тот же. Пишется свой темплейт в EditorTemplates и маркируется енум через UIHint.

hVosttповторю еще раз вопрос. как забиндешь?
См. выше.

P.S. Учи штатные инструменты MVC, а не пытайся переделать мир.
...
Рейтинг: 0 / 0
05.07.2013, 13:17
    #38321795
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
МСУ,

ты не понял вопроса первый раз,.. не понял и во второй. бог с тобой, я уж понял, это не лечится.

про рендеринг вопрос был? в третий раз: как забиндешь пришедшие данные в поле типа [Flags] Enum своими штатными средствами — хоть до усёру можешь свои штатные средства пропихивать, но в этом случае ты обломаешься, я те гарантирую это.
...
Рейтинг: 0 / 0
05.07.2013, 13:19
    #38321797
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
МСУ,

а раз не знаешь, лучше не лезь туда, где вообще не в зуб ногой...
...
Рейтинг: 0 / 0
05.07.2013, 13:21
    #38321800
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
hVosttМСУ, ты не понял вопроса первый раз,.. не понял и во второй. бог с тобой, я уж понял, это не лечится.
Убей себя. Или научись задавать вопросы.

hVosttпро рендеринг вопрос был? в третий раз: как забиндешь пришедшие данные в поле типа [Flags] Enum своими штатными средствами — хоть до усёру можешь свои штатные средства пропихивать, но в этом случае ты обломаешься, я те гарантирую это.
Я просто так данные не бинжу. Просто так даже мухи в туалет не ходят. Если мне нужно биндить енум в модель, значит есть во вью контнрол. Следовательно, это задача рендеринга. Если мне нужен тот же CheckBoxListFor, я возьму и сделаю хелпер .

P.S. Мне фиолетовы твои "задачки", оторванные от реальности. Если нужно просто так биндить - сходи в сад.
...
Рейтинг: 0 / 0
05.07.2013, 13:22
    #38321802
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
hVosttМСУ, а раз не знаешь, лучше не лезь туда, где вообще не в зуб ногой...
Ты едва научился формулировать свои тяжкие мысли, а уже про зубы с ногами заговорил. Даже не смешно.
...
Рейтинг: 0 / 0
05.07.2013, 13:28
    #38321816
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
МСУ,

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

ведь, как забиндеть ты так и не сказал. обходные пути — лесом. о них я не просил. как всегда, приведешь решение на любую свою проблему , но проигноришь задачу.
...
Рейтинг: 0 / 0
05.07.2013, 13:32
    #38321821
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
МСУТы едва научился формулировать свои тяжкие мысли, а уже про зубы с ногами заговорил. Даже не смешно.

смешно то, что ты опять мажешься. «так не делается» (у МСУ надо пологать) «зачем это нужно».... да ты просто генератор отмазок. не знаешь так и скажи, все поймут. а своими хелперами можешь подтереться, так как о них речь вообще не шла.
...
Рейтинг: 0 / 0
05.07.2013, 13:34
    #38321823
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
hVostt, у меня к примеру ViewModel в JSON сериализуется, так что не вижу, чем мне твой код полезен.
...
Рейтинг: 0 / 0
05.07.2013, 13:34
    #38321826
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
hVosttМСУ, супер. какая разница, что ты код перенес в другое место, по маппингу из своего массива валуев в енум. и можно забыть о повторном использовании техники. короч говнокодище. но это и не важно.
Какое другое место? Я никуда ничего не переношу, я использую стандартный функционал и хелперы, вынесенные в отдельную сборку. Если это нужно использовать в других проектах, я использую тот же стандартный функционал и сборку с хелперами. Ты о чем?

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

У нас две принципиально разные позиции:

1. Я решаю задачу в разрезе требования и достаю гланды через рот с помощью стандартный щипцов.
2. Ты решаешь задачу в разрезе автоматизации всего мира и достаешь гланды через задницу с помощью лопаты, которую тебе на время одолжил сосед.
...
Рейтинг: 0 / 0
05.07.2013, 13:36
    #38321831
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
hVosttМСУТы едва научился формулировать свои тяжкие мысли, а уже про зубы с ногами заговорил. Даже не смешно.

смешно то, что ты опять мажешься. «так не делается» (у МСУ надо пологать) «зачем это нужно».... да ты просто генератор отмазок. не знаешь так и скажи, все поймут. а своими хелперами можешь подтереться, так как о них речь вообще не шла.

Смешно то, что ты опять свой убогий универсальный код не знаешь к чему приткнуть. Навыдумывал себе сферических задач и с гордостью пишешь про не менее сферический байдинг. От чего мне "отмазываться", от твоего бреда? Не смешно даже.
...
Рейтинг: 0 / 0
05.07.2013, 13:39
    #38321837
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
МСУ,

я тя поздравляю! молодцом! но какое это имеет к теме отношение? разве спрашивалось про уместность расширения стандартного бинедера? што за нравы...
...
Рейтинг: 0 / 0
05.07.2013, 13:41
    #38321841
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
МСУСмешно то, что ты опять свой убогий универсальный код не знаешь к чему приткнуть. Навыдумывал себе сферических задач и с гордостью пишешь про не менее сферический байдинг. От чего мне "отмазываться", от твоего бреда? Не смешно даже.

от того, что ты вякаешь не к селу ни к городу. просто так, несешь феерический бред, при чем ни к месту. если те не нужен биндинг, нравится писать хелперы, ради бога. скажи спасибо, что стандартный биндер умеет хоть что-то кроме строк биндить, а то хелперов пришлось бы писать еще больше. давай не беси свой тупостью. раз такой грамотный молодец, иди мимо.
...
Рейтинг: 0 / 0
05.07.2013, 13:46
    #38321848
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
skyANAhVostt, у меня к примеру ViewModel в JSON сериализуется, так что не вижу, чем мне твой код полезен.

хм... ну здорово :) у меня тоже много чего во много чего сериализуется. по вопросу кастомного расширения биндинга во многих книгах есть целые главы, на стеке очень много вопросов и ответов, очень много в сети всяких мануалов, на сайте asp.net туториалы. да и сам фреймворк заточен под расширение.. но....... дайте-как подумать. А! точняк! если это не нужно МСУ и еще кому-то, то — вот жешь дэбилы эти люди, ну конкретные дауны, больше половины команды разработчиков ASP.NET MVC мог бы заменить один МСУ, столько бумаги измарать на ненужную доку, оно же не нужно никому, сколько же людей заблуждается. надо срочно им всем открыть глаза! я этим займусь.
...
Рейтинг: 0 / 0
05.07.2013, 13:52
    #38321863
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
hVosttМСУ, я тя поздравляю! молодцом! но какое это имеет к теме отношение? разве спрашивалось про уместность расширения стандартного бинедера? што за нравы...
Спасибо за поздравления, но я опять тебя не понял. Отношение чего к чему?

hVosttот того, что ты вякаешь не к селу ни к городу. просто так, несешь феерический бред, при чем ни к месту. если те не нужен биндинг, нравится писать хелперы, ради бога. скажи спасибо, что стандартный биндер умеет хоть что-то кроме строк биндить, а то хелперов пришлось бы писать еще больше. давай не беси свой тупостью. раз такой грамотный молодец, иди мимо.
Какой-то поток слюны. Остановись и еще раз сформулируй свою мысль. Еще раз, хелперы пишут не для наличия биндинга. Бред сивой кобылы.
...
Рейтинг: 0 / 0
05.07.2013, 13:52
    #38321865
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
hVosttskyANAhVostt, у меня к примеру ViewModel в JSON сериализуется, так что не вижу, чем мне твой код полезен.

хм... ну здорово :) у меня тоже много чего во много чего сериализуется. по вопросу кастомного расширения биндинга во многих книгах есть целые главы, на стеке очень много вопросов и ответов, очень много в сети всяких мануалов, на сайте asp.net туториалы. да и сам фреймворк заточен под расширение.. но....... дайте-как подумать. А! точняк! если это не нужно МСУ и еще кому-то, то — вот жешь дэбилы эти люди, ну конкретные дауны, больше половины команды разработчиков ASP.NET MVC мог бы заменить один МСУ, столько бумаги измарать на ненужную доку, оно же не нужно никому, сколько же людей заблуждается. надо срочно им всем открыть глаза! я этим займусь.

Какой-то бред сумасшедшего...
...
Рейтинг: 0 / 0
05.07.2013, 14:06
    #38321896
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
МСУ,

итак, у нас есть DTO, где сидит поле [Flags] Enum

есть вью-модель, где у тебя int[]

и вот такое уже не прокатит Html.EditorFor(x => x.Value) или хелпер Html.MyEditor(x => x.Value), надо позаботиться, чтобы передать правильный MultiSelectList, — лишний повторяющийся код

потом полученные данные надо еще собрать обратно в Enum... и все это покрыто жирным слоем ненужной обвязки.


в ситуации с [Flags] Enum во вью модели следующие преимущества:

1. не теряется тип, поэтому никакие MultiSelectList передавать не нужно, и даже заботиться об этом, все что нужно для рендеринга сидит в самом типе [Flags] Enum
2. маппинг из и в DTO прямой, ничего ковырять отдельно чтобы запамить не нужно
3. все!

но надо научиться делать кастомный биндинг. что конечно ппц как нелегко.
...
Рейтинг: 0 / 0
05.07.2013, 14:17
    #38321920
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
hVosttМСУ,

итак, у нас есть DTO, где сидит поле [Flags] Enum

есть вью-модель, где у тебя int[]

и вот такое уже не прокатит Html.EditorFor(x => x.Value) или хелпер Html.MyEditor(x => x.Value), надо позаботиться, чтобы передать правильный MultiSelectList, — лишний повторяющийся код

потом полученные данные надо еще собрать обратно в Enum... и все это покрыто жирным слоем ненужной обвязки.

По-моему проблема, раздутая на пустом месте. Если мне нужен малти чекбоксы, я использую проверенный вариант. Мне не нужен в данном случае енум. Если потребуется, я напишу свой хелпер или EditorTemplates + UIHint.

hVosttно надо научиться делать кастомный биндинг. что конечно ппц как нелегко.
Я тебе говорю не о том, что кастомный биндинг это плохо, а о том, что проблема "твоя" надумана и высосана из пальца. Писать кастомный байдинг ради того, чтобы он что-то там пробайндил с флагами. Да ты неимоверно крут, товарещ
...
Рейтинг: 0 / 0
05.07.2013, 14:17
    #38321921
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
никакие [мудти]селектлисты не нужны

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
@model Enum
@{
    var name = ViewData.TemplateInfo.HtmlFieldPrefix;
    var type = Model.GetType();
    
}

@foreach (Enum e in Enum.GetValues(type))
{
    var display = type.GetField(Enum.GetName(type, e)).GetCustomAttribute<DisplayAttribute>();
    if (display != null && (display.GetAutoGenerateField() ?? true))
    {
    <label class="checkbox" title="@display.GetDescription()">
        <input type="checkbox" name="@name" value="@e.ToString()" checked="@Model.HasFlag(e)" />
        @display.Name
    </label>
    }
}
...
Рейтинг: 0 / 0
05.07.2013, 14:23
    #38321929
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
МСУПо-моему проблема, раздутая на пустом месте. Если мне нужен малти чекбоксы, я использую проверенный вариант. Мне не нужен в данном случае енум. Если потребуется, я напишу свой хелпер или EditorTemplates + UIHint.

так правильно, твой едитор темплейт забиндится в коллекцию int[] , которую тебе в любом случае надо будет собирать в enum — лишняя работа. кроме того, твой хелпер не обладает информацией о том, что рендерит, тебе надо специально мультиселект лист передавать. везде по-чуть-чуть, в итоге лапша доширак, индусы обзавидуются.

да и не только ради енумов, енумы привел как пример того, что однозначно не биндится, только через Ж... с изобретанием своих хелперо-велосипедов. вообще, что угодно кастомизировать. нет желания на каждый чих покрывать код слоем хелперов, потом это не поддерживаемое гумно развивать. однозначный биндинг, и вью-модель максимально приближенная к тому, с чем реально работаешь, а не высеры типа коллекции int[], когда на самом деле там должен быть енум с флагами.
...
Рейтинг: 0 / 0
05.07.2013, 14:25
    #38321931
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расширение стандартного MVC биндера
hVosttникакие [мудти]селектлисты не нужны

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
@model Enum
@{
    var name = ViewData.TemplateInfo.HtmlFieldPrefix;
    var type = Model.GetType();
    
}

@foreach (Enum e in Enum.GetValues(type))
{
    var display = type.GetField(Enum.GetName(type, e)).GetCustomAttribute<DisplayAttribute>();
    if (display != null && (display.GetAutoGenerateField() ?? true))
    {
    <label class="checkbox" title="@display.GetDescription()">
        <input type="checkbox" name="@name" value="@e.ToString()" checked="@Model.HasFlag(e)" />
        @display.Name
    </label>
    }
}



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
 public static MvcHtmlString CheckBoxListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty[]>> expression, MultiSelectList multiSelectList, object htmlAttributes = null)
        {
            MemberExpression body = expression.Body as MemberExpression;
            string propertyName = body.Member.Name;

            TProperty[] list = expression.Compile().Invoke(htmlHelper.ViewData.Model);

            List<string> selectedValues = new List<string>();

            if (list != null)
            {
                selectedValues = new List<TProperty>(list).ConvertAll<string>(delegate(TProperty i)
                { return i.ToString(); });
            }

            TagBuilder divTag = new TagBuilder("div class=\"CheckBoxListFor\"");
            divTag.MergeAttributes(new RouteValueDictionary(htmlAttributes), true);

            foreach (SelectListItem item in multiSelectList)
            {
                divTag.InnerHtml += String.Format("<label><input type=\"checkbox\" name=\"{0}\" id=\"{0}_{1}\" " +
                                                    "value=\"{1}\" {2} />{3}</label>",
                                                    propertyName,
                                                    item.Value,
                                                    selectedValues.Contains(item.Value) ? "checked=\"checked\"" : "",
                                                    item.Text);
            }

            return MvcHtmlString.Create(divTag.ToString());
        }
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Расширение стандартного MVC биндера / 25 сообщений из 93, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]