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

Код: 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
Расширение стандартного MVC биндера
    #38321717
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttОчень не хватает возможности программировать биндеры и вешать атрибутом на проперти.
Особых сложностей не испытываю.
...
Рейтинг: 0 / 0
Расширение стандартного MVC биндера
    #38321733
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

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

Код: 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
Расширение стандартного MVC биндера
    #38321760
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Расширение стандартного MVC биндера
    #38321767
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

итак, у нас есть 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
Расширение стандартного MVC биндера
    #38321920
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМСУ,

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

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

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

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

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

hVosttно надо научиться делать кастомный биндинг. что конечно ппц как нелегко.
Я тебе говорю не о том, что кастомный биндинг это плохо, а о том, что проблема "твоя" надумана и высосана из пальца. Писать кастомный байдинг ради того, чтобы он что-то там пробайндил с флагами. Да ты неимоверно крут, товарещ
...
Рейтинг: 0 / 0
Расширение стандартного MVC биндера
    #38321921
Фотография 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>
    }
}
...
Рейтинг: 0 / 0
Расширение стандартного MVC биндера
    #38321929
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУПо-моему проблема, раздутая на пустом месте. Если мне нужен малти чекбоксы, я использую проверенный вариант. Мне не нужен в данном случае енум. Если потребуется, я напишу свой хелпер или EditorTemplates + UIHint.

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

да и не только ради енумов, енумы привел как пример того, что однозначно не биндится, только через Ж... с изобретанием своих хелперо-велосипедов. вообще, что угодно кастомизировать. нет желания на каждый чих покрывать код слоем хелперов, потом это не поддерживаемое гумно развивать. однозначный биндинг, и вью-модель максимально приближенная к тому, с чем реально работаешь, а не высеры типа коллекции int[], когда на самом деле там должен быть енум с флагами.
...
Рейтинг: 0 / 0
Расширение стандартного MVC биндера
    #38321931
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
25 сообщений из 93, страница 1 из 4
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Расширение стандартного MVC биндера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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