11 / 10 / 8
Регистрация: 06.07.2015
Сообщений: 75
|
||||||||||||||||
1 | ||||||||||||||||
Строго-типизированное представление. Как оно работает?16.02.2017, 21:45. Показов 3005. Ответов 28
Метки нет (Все метки)
Всем Доброго времени суток.
Никак не могу разобраться со строго-типизированными представлениями. Есть представление типа:
1. Чем отличается return View() от return View(model) в контроллере? 2. Каким образом передается ModelState в представление? Почему при возврате RedirectToAction он не передается, а при PartialView и View передается. Выяснил путем тыканья, в других случаях также выяснять? 3. На странице используется строго-типизированное представление указанное выше в виде @RenderBody, а также пара строго-типизированных представлений в виде @Html.Partial. Как их подружить? При попытке сделать так return View(model) другое представление ругается что model для возврата не соответствует с другими представлениями. Отсюда вопрос а можно сделать условие чтоб если не твое, то и не трогай!? Типа такого:
Как то так. прошу помощи так как сам уже вымотался во всем этом разбираться.
0
|
16.02.2017, 21:45 | |
Ответы с готовыми решениями:
28
Как передать из одного контроллера объект модели в строго типизированное представление другого контроллера Как оно работает ? Как оно работает? КАК оно работает? |
64 / 64 / 35
Регистрация: 14.12.2015
Сообщений: 145
|
||||||
17.02.2017, 09:33 | 2 | |||||
Silvestor, привет! Я не эксперт, но попытаюсь объяснить как сам это понимаю.
1)return View() и return View(model) отличаются тем, что в первом случае не передаётся модель (спасибо, кэп). Но в обоих случаях передаётся, например, ModelState. То есть при возникновении ошибки, мы и в первом и во втором случае сможем передать её на вьюху. Просто в первом случае она будет не заполнена. 2) Тут могу ошибаться, но думается, что ModelState живёт до тех пор, пока мы работаем с конкретной моделью. При RedirectToAction мы вообще вызываем другой метод контроллера и поэтому ни о каком ModelState нет речи. 3) Тут немного неясно, но предположу, что Вам нужно использовать более комплексную ViewModel, а в отдельные Partial при необходимости передавать что-то типа
0
|
11 / 10 / 8
Регистрация: 06.07.2015
Сообщений: 75
|
|
17.02.2017, 12:48 [ТС] | 3 |
Спасибо. Но:
1. Не все так просто. Хотел бы согласится, но мучает один вопрос, в случае с return View() данные модели тоже передаются неявно в представление. Собственно от чего вопрос и возник. Если вызвать return View() в POST методе контроллера, то данные модели также передадутся в представление (хоть и не все, пароли не передаются) и будут в разметке в полях инпут. Как я примерно это понимаю здесь возможно опять используется ModelState, и из него данные модели пишутся в разметку, а не из модели как таковой. Естественно если в случае с return View() в представлении обратится к свойству модели, скажем так @Model.Login, то будет ошибка, в отличии от return View(model). 2. Я как понимаю он живет всегда и в любом методе контроллера, но вот передавать его или нет это уже решает среда. А вот как она решает, а бог ее знает. По логике конечно все что выше написано верно, но.... 3. Смысл в том, что у меня на одной странице несколько форм, каждая из своего частичного представления, со своим model. Если заполнять формы и передавать данные то все ок. Но если в контроллере вызвать return View(model), то в одном из частичных представлений вылетит ошибка со словами что переданная модель не соответствует той которая используется в нем. Смысл в том что когда мы передаем return View(model), то все три представления пытаются обработать переданную модель, хотя предназначается она тому представлению из которого была сформирована.
0
|
3462 / 2473 / 695
Регистрация: 02.08.2011
Сообщений: 6,704
|
||||||
17.02.2017, 13:19 | 4 | |||||
Почему вы так решили?
Верно, потому что модель не передается. попробуйте вернуть PartialView(model). Добавлено через 8 минут Partial View были созданы для асинхронных запросов, то есть на сервере вполне может быть такая логика:
0
|
11 / 10 / 8
Регистрация: 06.07.2015
Сообщений: 75
|
||||||
17.02.2017, 20:19 [ТС] | 5 | |||||
Может не совсем так выразился. Передаются данные модели, которую пользователь заполнил в форме и передал на сервер.
Посидев с отладчиком разобрался как это работает: При отправке данных формы на сервер, в методе обработчике POST запроса из контроллера формируется ModelState, который содержит в себе коллекцию данных формы. Если заново вызвать тоже представление (ощибки передать, ну или данные какие затребовать дополнительно) вызовами View() или View(model), представление, а именно поля формы будут заполнены данными из ModelState, в случае если имена совпадают. При этом если мы перед вызовом View(model) изменили некоторые данные в model, то поля формы все равно будут получать значения из ModelState, и только если в ModelState нет подходящих значений то используются данные из model. Код из внетренностей MVC:
Там где нужны были данные модели для формы и через View() можно получить. А в случае генерации страницы Error.cshtml и передачи текста сообщения об ошибке в модели, PartialView(model) не поможет.
0
|
3462 / 2473 / 695
Регистрация: 02.08.2011
Сообщений: 6,704
|
|
17.02.2017, 20:45 | 6 |
Так непонятно, что вам нужно. PartialView предназначены для асинхронных запросов (ajax).
Обычно делают так: в основной вьюхе при первой загрузке в razor-е вызывают методы для всех PartialView (Htm.RenderAction, либо Html.PartialView, как-то так). А Partial потом уже сами по себе обновляются по ajax-у, вызывая свои собственные методы через Ajax.BeginForm.
0
|
11 / 10 / 8
Регистрация: 06.07.2015
Сообщений: 75
|
||||||
17.02.2017, 22:09 [ТС] | 7 | |||||
С частичными представлениями все понятно, у меня собственно так и сделано для модальных окон регистрации и авторизации, которые общие на все страницы и подгружаются вместе с _layout.chtml.
Но вот допустим есть у меня представление Error.chtml которое не частичное и рендерится через вызов view("Error"), в случае каких либо ошибок в контроллере. Задумал я к этому пердставлению прилепить детальную информацию об ошибке через view_model с полем message. Чтобы было типа такого:
Нет, можно конечно ошибку и через ViewBag передавать, но как то это не красиво получается. Подумал может есть возможность подружить разные модели на одной странице.
0
|
2735 / 2041 / 380
Регистрация: 22.07.2011
Сообщений: 7,731
|
|
18.02.2017, 01:23 | 8 |
Для этого придуманы пространства имен. , без явного указания которых в таком случае , проект даже не скомпилируется в студии.
0
|
11 / 10 / 8
Регистрация: 06.07.2015
Сообщений: 75
|
|
18.02.2017, 11:00 [ТС] | 9 |
А это здесь при чем, не понял. Вы может какие-то другие пространства имен имеете в виду.
Насколько я понимаю, при задании скажем @model Models.ResetPasswordViewModel в представлении оно ожидает что ему будет передана именно эта модель, и в случае если в поток обработки представлений передается другая модель с данными, то возникает ошибка несовместимости типов, хоть в разные пространства имен помести.
0
|
12078 / 8387 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|
18.02.2017, 11:08 | 10 |
0
|
11 / 10 / 8
Регистрация: 06.07.2015
Сообщений: 75
|
||||||
18.02.2017, 11:41 [ТС] | 11 | |||||
Вот как:
А в _Layout через @RenderBody() передается ResetPasswordViewModel. Схематично _Layout:
0
|
3462 / 2473 / 695
Регистрация: 02.08.2011
Сообщений: 6,704
|
|
18.02.2017, 13:23 | 13 |
Тут говорится, что вы пытаетесь засунуть ResetPasswordViewModel вместо RegisterViewModel.
Покажите View для сброса пароля.
0
|
11 / 10 / 8
Регистрация: 06.07.2015
Сообщений: 75
|
||||||
18.02.2017, 13:39 [ТС] | 14 | |||||
Не понял, как вы предлагаете реализовать. return viewpartial вернет же только частичное представление. Ajax использовать?
Поподробней можно пожалуйста. Добавлено через 1 минуту Кликните здесь для просмотра всего текста
0
|
12078 / 8387 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|
18.02.2017, 13:58 | 15 |
Ну так, а чего ты хотел?)) Свормируй отдельную модель представления, в которую влож нужные для этих partial модели и передавай их им явно.
0
|
11 / 10 / 8
Регистрация: 06.07.2015
Сообщений: 75
|
|
18.02.2017, 14:32 [ТС] | 16 |
Сформированы модели для них, и используются при случае. Но в данном случае мне не надо в эти партиалы что либо передавать.
0
|
12078 / 8387 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|
18.02.2017, 16:51 | 17 |
Silvestor, тогда передавай туда null, а в самих partial делай проверку. Иначе фигня выходит.
0
|
11 / 10 / 8
Регистрация: 06.07.2015
Сообщений: 75
|
|
18.02.2017, 21:32 [ТС] | 18 |
0
|
12078 / 8387 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|
19.02.2017, 05:51 | 19 |
Silvestor, что-то вопрос несерьёзный. Почитай про Partials. Ссылка на модель представления передаётся вторым аргументом, после имени\пути к частичному представлению. Можно передать либо Null, либо пустую модель представления.
0
|
11 / 10 / 8
Регистрация: 06.07.2015
Сообщений: 75
|
|
19.02.2017, 16:45 [ТС] | 20 |
Usaga, что такое Partial View мне понятно, и использовать их умею, писал же уже.
Мне не понятно вот это, что вы имеете ввиду. Может мы просто о разном говорим.
0
|
19.02.2017, 16:45 | |
19.02.2017, 16:45 | |
Помогаю со студенческими работами здесь
20
Typeid-как оно работает Pascal Подкажите как оно работает? Как оно работает (контекстное меню)? Shared object или как оно работает? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |