powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Полиморфизм моделей не работает ?
18 сообщений из 18, страница 1 из 1
Полиморфизм моделей не работает ?
    #38956241
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.
Пытаюсь создать вьюху и контрлолер, умеющий работать с двумя видами моделей.

Вот так модель передается во вьюху:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
        [HttpGet]
        public ActionResult Edit(string id.........., bool? IsExtended)
        {
            if (IsExtended.HasValue && IsExtended.Value)
            {                
                var model = new ExtendedEditModel()
                {
                    IsExtended = true,
                };

                return View(_editView, model);
            }



EditModel - базовый тип модели
ExtendedEditModel - расширенный тип модели

IsExtended это свойство базового класса ! Я его ввел для уменьшения числа кастингов (проверок типа if model is ExtendedEditModel). Да, я понимаю, что получается что базовый класс знает о чилде и это не очень правильно с точки зрения ООП. В данном случае мне важнее чтобы получилось работать с двумя типами моделей во вьюхе и простота кода, чем чистота ООП - полиморфизм используется лишь как средство.

Во вьюхе модель описана так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
@model Models.EditModel
...
@if (!Model.Id.IsNullOrEmpty() && (Model.IsExtended))
                            {
                                foreach (var ext in (Model as ExtendedEditModel).ExtendedProperties)      // {1}
                                {
                                    <tr>
                                        <td>@ext.Kod</td>
                                        <td>@ext.Value</td>
                                    </tr>
                                }
                            }


Не знаю как отработает код на строке {1}. Не доходило до него еще :)
PS. Во время пошаговой отладки вьюхи - модель действительно отмечается как Extended . А вот в метод контроллера она уже приходит как базовая !


а так контроллер принимает ее с вьюхи для обработки

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
       [HttpPost]
        public ActionResult Edit(EditModel model)
        {
            if (!this.ModelState.IsValid)
            {
                return View(_editView, model);
            }
			
			if (model.IsExtended)
			{			
			var ProperiesList =   (model as ExtendedEditModel).ExtendedProperties   << вылетает NullReferenceException, т.к. (model as ExtendedEditModel) = Null
                          foreach (.... ProperiesList)...
                        }
       }



Как это исправить ? Как передать в метод контроллера расширенную модель ? Может нужно что-то передать в Hiden (через @Html.HiddenFor) ?
...
Рейтинг: 0 / 0
Полиморфизм моделей не работает ?
    #38956248
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Форма во вьюхе описана так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
            @using (Html.BeginForm("Edit", "MyController", FormMethod.Post, new {enctype = "multipart/form-data", @class = "form-horizontal well col-lg-9",}))
            {
                @Html.HiddenFor(x => Model.Id)
                @Html.HiddenFor(x => Model.IsExtended)...
                <fieldset>
                    <div >
                        <label>Наименование<br/><span>@Html.ValidationMessageFor(x => x.Name)</span></label>
                        <div>@Html.TextBoxFor(x => x.Name, new {@class = "form-control"})</div>
                    </div>
                    <div class="form-group">
                        <div>
                            <input type="submit" value="Сохранить"/>
                        </div>
                    </div>
                </fieldset>
            }
...
Рейтинг: 0 / 0
Полиморфизм моделей не работает ?
    #38956257
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek,
Использйте в view уже расширенную версию модели:
Код: html
1.
@model Models.EditExtendedModel



А в HttpPost методе принимайте EditExtendedModel вместо EditModel. Мы так делаем на работе, все работает.
Только через интерфейсы.
...
Рейтинг: 0 / 0
Полиморфизм моделей не работает ?
    #38956262
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
смотреть в сторону DisplayTemplate и EditTemplate, красиво и лаконично и без кастылей
...
Рейтинг: 0 / 0
Полиморфизм моделей не работает ?
    #38956267
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu,
Да не нужен здесь никакой EditorTemplate.
...
Рейтинг: 0 / 0
Полиморфизм моделей не работает ?
    #38956298
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleron,
аргументируй.
...
Рейтинг: 0 / 0
Полиморфизм моделей не работает ?
    #38956302
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRuAxeleron,
аргументируй.
Нечего аргментировать особо. EditorTemplate используется как шаблон для комплексных контролов и многократного переиспользования (прошу прощения за слово) в проекте. Почитай книжку по MVC - там EditorTemplates почти в самом начале разбираются. Полезная штука, кстати, очень рекомендую к использованию.
...
Рейтинг: 0 / 0
Полиморфизм моделей не работает ?
    #38956307
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleron
А в HttpPost методе принимайте EditExtendedModel вместо EditModel. Мы так делаем на работе, все работает.
Только через интерфейсы.

не понял !
Так если вьюха будет работать с базовой моделью и пошлет в контроллер ее - то что в него прийдет ? Ведь в контроллере описана расширенная модель. Или по простому свойства при мапинге не заполнятся и все ? Т.е. проблемы не будет ?

Фразы про интерфейсы я не понял. Каким боком их тут прикручивать ? Сейчас все основывается на полиморфизме, не понимаю чем помогут интерфейсы.
...
Рейтинг: 0 / 0
Полиморфизм моделей не работает ?
    #38956324
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronНечего аргментировать особо. EditorTemplate используется как шаблон для комплексных контролов и многократного переиспользования (прошу прощения за слово) в проекте. Почитай книжку по MVC - там EditorTemplates почти в самом начале разбираются. Полезная штука, кстати, очень рекомендую к использованию.
и? что не так с использованием в рамках задачи ТС?
...
Рейтинг: 0 / 0
Полиморфизм моделей не работает ?
    #38956343
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek,
Ну так попробуй. Я говорил не про мастер класс, а наследованный.
...
Рейтинг: 0 / 0
Полиморфизм моделей не работает ?
    #38956347
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekФразы про интерфейсы я не понял. Каким боком их тут прикручивать ?
Классы можно 'сажать' на интерфейсы. Если это, конечно, новость...
...
Рейтинг: 0 / 0
Полиморфизм моделей не работает ?
    #38956361
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок. Про интерфейсы в классах не знал, спасибо (сарказм ;) ).

Я просто не так понял Вашу фразу. Думал фраза про интерфейсы была предложением и мне попробовать, не понял как это мне поможет.
Но теперь понимаю, что фраза про интерфейсы была в контексте "у нас так сделано" а не предложением и мне так сделать.
...
Рейтинг: 0 / 0
Полиморфизм моделей не работает ?
    #38956373
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek,
Про интерфейсы - это было просто предложение использовать хорошую практику, не более того. К твоей конкретной задаче это прямого отношения не имеет.
...
Рейтинг: 0 / 0
Полиморфизм моделей не работает ?
    #38956426
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronProBiotek,
Про интерфейсы - это было просто предложение использовать хорошую практику, не более того. К твоей конкретной задаче это прямого отношения не имеет.

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

Интерфейсы то в проекте есть. И autofac используется по полной. В конструктор контроллера передается все через зависимости, как в книгах Фримана.

Для вьюхи же интерфейсы, мне кажется, достаточно бесполезны - хватит классов.
Модель жестко связана с контроллером 1 к 1. Если создаем контроллер то модель создается без вариантов. Тут инжектить нечего, и соотвественно интерфейсы ни к чему. Интерфейсы нужны лишь на уровне контроллера.

По сути интерфейсы используются для тестов же, в основном. А вьюху можно разве юнит-тестить ? Если нет - то и не нужны интерфейсы. Мокать то нечего...
...
Рейтинг: 0 / 0
Полиморфизм моделей не работает ?
    #38956444
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekНо мне показалось удобным сделать через полиморфизм классов.
Это не полиморфизм. Пример того, что ты привел назвается наследованием.

ProBiotekИнтерфейсы то в проекте есть.
Это не самоцель просто иметь интерфейсы, с ними нужно уметь еще и правильно работать. А так бестолку иметь их 'шоб было'.

ProBiotekДля вьюхи же интерфейсы, мне кажется, достаточно бесполезны - хватит классов.
А ты попробуй использовать интерфейс в модели вьюхи...

ProBiotekМодель жестко связана с контроллером 1 к 1. Если создаем контроллер то модель создается без вариантов
Это в корне неверное понимание концепции MVC, да и ООП в принципе.

ProBiotekИнтерфейсы нужны лишь на уровне контроллера.
То же самое, см выше. Пока нет понимания зачем нужны интерфейсы, лучше вообще убрать из программы их и не тратить девелоперское время впустую.

ProBiotekПо сути интерфейсы используются для тестов же, в основном.
Обширное заблуждение.

ProBiotekА вьюху можно разве юнит-тестить ?
Можно.

В общем просто поток... искореженного сознания. Без обид.
...
Рейтинг: 0 / 0
Полиморфизм моделей не работает ?
    #38956605
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronProBiotekМодель жестко связана с контроллером 1 к 1. Если создаем контроллер то модель создается без вариантов
Это в корне неверное понимание концепции MVC, да и ООП в принципе.

ProBiotekИнтерфейсы нужны лишь на уровне контроллера.
То же самое, см выше. Пока нет понимания зачем нужны интерфейсы, лучше вообще убрать из программы их и не тратить девелоперское время впустую.


Ок, согласен не полиморфизм а простое наследование тут используется конечно, что то я действительно не так обозвал :)

Контроллер выполняет некие действия. Для чего у него есть экшены, принимающие конкретную модель. Причем тут интерфейсы вобще ?
Чтобы протестить такой контроллер - пожалуйста, передавайте модель и проверяйте результат.

Принципиально. Интерфейсы нужны тем, что менее связывают классы, чем абстрактный класс. Быстро создать реализацию интерфейса своим классом проще, чем создавать наследника от абстрактного класса. Другой пример это Linq (и linq to...), т.е. когда интерфейс используется не для простоты создания своих классов, а для написания некоего алгоритма, применимого для всех реализаций некоего интерфейса.

Но почему принципиально нужно передавать интерфейсы во вьюху то ? Ведь во вьюху должна передаваться простая модель POCO. Чем он тут будет отличаться от интерфейса ? Методов нет, вызывать нечего, только поля с данными.
...
Рейтинг: 0 / 0
Полиморфизм моделей не работает ?
    #38956654
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekОк, согласен не полиморфизм а простое наследование тут используется конечно, что то я действительно не так обозвал :)
Так такие вещи надо знать. А то позовут на интервью и на первом же элементарном вопросе завалят. не обидно будет потраченного времени, денег на билет? :)

ProBiotekКонтроллер выполняет некие действия. Для чего у него есть экшены, принимающие конкретную модель. Причем тут интерфейсы вобще ?
Чтобы протестить такой контроллер - пожалуйста, передавайте модель и проверяйте результат.
Вот сам себе прочиворечишь. Выше ты говорил, что интерфейсы нужны для тестирования. Ну и как ты собираешься создавать мок объект из класса?

ProBiotekПринципиально. Интерфейсы нужны тем, что менее связывают классы, чем абстрактный класс. Быстро создать реализацию интерфейса своим классом проще, чем создавать наследника от абстрактного класса.
Интерфейс и абстрактный класс - принципиально разные вещи и используются для разных задач. Кстати, тоже один из часто задаваемых вопросов в чем разница мажду ними. Так что очень рекомендую подтянуть базовые знания ООП.

ProBiotekНо почему принципиально нужно передавать интерфейсы во вьюху то ? Ведь во вьюху должна передаваться простая модель POCO. Чем он тут будет отличаться от интерфейса ? Методов нет, вызывать нечего, только поля с данными.
Значит пока рано использовать их раз нет представления о сути вещей. А вообще в данном случае - для тестирования контролера. Но вы у себя все равно не используете ТДД, так что можно пока не волноваться.
...
Рейтинг: 0 / 0
Полиморфизм моделей не работает ?
    #38956786
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleron,

Да знаю я про ООП :), ну ошибся немного при написании темы.
Мысли ушли в сторону полиморфизма только потому, что я хотел в одной модели, во вьюхе, хранить два вида моделей - от этого и закрутилось. Голова была занята обдумыванием самой проблемы а не Тайтла для темы, сорри :)

Мой вопрос был - зачем во вьюху, передавать модель: интерфейс. Просто уж заинтриговали прям :)

Интерфейс в юнит тестах используется чтобы можно было замокать что-то. Когда мок объект суть - пустышка над интерфейсом, без побочных эффектов или с заранее известными эффектами. Чтобы можно было подменить слоооожный клас реализующий интерфейс.
А что мокать в модели во вьюхе мне и не ясно. Если модель суть POCO. Ну создавайте сразу эту POCO, передавайте да тестите. Толку тут от интерфейса :)
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Полиморфизм моделей не работает ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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