Доброго времени суток, я начал разбираться с MVC, стандартные примеры работают отлично, но как только начал пытаться сделать рабочее приложение наткнулся на проблемы..
Мне нужно разместить в мастер пейдже свой контролл — например комбобокс контрол выбора языка.. или текстовое поле с кнопкой — неважно, покопавшись в гугле нашел такой вариант — создаем отдельный контроллер для нашего компонента унаследовав его от
В мастер пейдже этот контрол подключаеться так <%= Html.RenderComponent<LanguageController>( c => c.LoadLangList( ) )%>
все работает — в мастер пейдже появляется список языков (список возвращаеться контроллером) но у меня не получаеться выбрать язык и изменить его — отправить айди языка контроллеру.. Не пойму как из кода-вью компонента Language отправить код выбранного языка контроллеру LanguageController.. пытаюсь постить <form action="/Language/ChangeLanguage" method="post"> но MVC не находит этот контроллер
The controller for path '/Language/ChangeLanguage' could not be found or it does not implement the IController interface.
Parameter name: controllerType
т.е. как я понял ComponentController не реализует IController и ему нельзя передать через сабмит?..
Как тогда передавать данные компонентному контроллеру из вью или этот контролл может их только выводить?
Может кто то сталкивался с этой проблемой, информации по MVC Preview 3 не много, буду очень признателен
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: MVC: Размещение user controls в мастер пейдже.
Здравствуйте, sonik, Вы писали:
S>Доброго времени суток, я начал разбираться с MVC, стандартные примеры работают отлично, но как только начал пытаться сделать рабочее приложение наткнулся на проблемы..
S>Мне нужно разместить в мастер пейдже свой контролл — например комбобокс контрол выбора языка.. или текстовое поле с кнопкой — неважно, покопавшись в гугле нашел такой вариант — создаем отдельный контроллер для нашего компонента унаследовав его от
S>В мастер пейдже этот контрол подключаеться так <%= Html.RenderComponent<LanguageController>( c => c.LoadLangList( ) )%> S>все работает — в мастер пейдже появляется список языков (список возвращаеться контроллером) но у меня не получаеться выбрать язык и изменить его — отправить айди языка контроллеру.. Не пойму как из кода-вью компонента Language отправить код выбранного языка контроллеру LanguageController.. пытаюсь постить <form action="/Language/ChangeLanguage" method="post"> но MVC не находит этот контроллер
S>The controller for path '/Language/ChangeLanguage' could not be found or it does not implement the IController interface. S>Parameter name: controllerType S>
S>т.е. как я понял ComponentController не реализует IController и ему нельзя передать через сабмит?..
Нельзя
S>Как тогда передавать данные компонентному контроллеру из вью или этот контролл может их только выводить?
Только выводить
S>Может кто то сталкивался с этой проблемой, информации по MVC Preview 3 не много, буду очень признателен
ComponentController еще то говно. К сожалению альтернативы ему нет, поэтому приходится геморроиться с таким.
Preview 3 еще не ковырял. Есть подозрение что можно натравить ViewEngine на ViewResult и получить отрендеренный Html.
Re[2]: MVC: Размещение user controls в мастер пейдже.
Здравствуйте, gandjustas, Вы писали:
G>ComponentController еще то говно. К сожалению альтернативы ему нет, поэтому приходится геморроиться с таким. G>Preview 3 еще не ковырял. Есть подозрение что можно натравить ViewEngine на ViewResult и получить отрендеренный Html.
Не совсем понял про отрендеренный html, да в ComponentController есть свойство RenderedHtml в который можно записать свой html, только как это поможет?
Я тогда не понимаю как из мастер пейджа обращаться к нужному контроллеру Допустим бросим в мастер пейдж <%= Html.DropDownList( "LanguageList", ViewData["LangList"] ) %> ViewData у нас есть в мастерпейдже, но для этого надо чтобы каждый контролл в каждом action инициализировал ее (можно сделать наследника Controller и переопределить какой нить метод типа RenderView и возвращать там свой контейнер с общим для всех полем LangCode..) или как? и самое главное как узнать в мастер пейдже какому контроллу передать выбранный язык
<form action="???"method="post">
Как вы решаете эту проблему?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: MVC: Размещение user controls в мастер пейдже.
Здравствуйте, sonik, Вы писали:
S>Здравствуйте, gandjustas, Вы писали:
G>>ComponentController еще то говно. К сожалению альтернативы ему нет, поэтому приходится геморроиться с таким. G>>Preview 3 еще не ковырял. Есть подозрение что можно натравить ViewEngine на ViewResult и получить отрендеренный Html.
S>Не совсем понял про отрендеренный html, да в ComponentController есть свойство RenderedHtml в который можно записать свой html, только как это поможет?
Не поможет. Я вообще-то не о том.
S>Я тогда не понимаю как из мастер пейджа обращаться к нужному контроллеру Допустим бросим в мастер пейдж <%= Html.DropDownList( "LanguageList", ViewData["LangList"] ) %> ViewData у нас есть в мастерпейдже, но для этого надо чтобы каждый контролл в каждом action инициализировал ее (можно сделать наследника Controller и переопределить какой нить метод типа RenderView и возвращать там свой контейнер с общим для всех полем LangCode..) или как? и самое главное как узнать в мастер пейдже какому контроллу передать выбранный язык
<form action="???"method="post">
S>Как вы решаете эту проблему?
То есть вам надо передавать параметры от ViewPage к masterPage, так?
1)Можно через TempData (сам такое ни разу не использовал)
2)Можно в Masterpage анализировать какая страница сейчас обрабатывается и производить какие-то действия
3)Сам использую тупой способ: у меня каждый ViewPage рендерит компонент со своими параметрами
Re: MVC: Размещение user controls в мастер пейдже.
Здравствуйте, sonik, Вы писали:
S>Доброго времени суток, я начал разбираться с MVC, стандартные примеры работают отлично, но как только начал пытаться сделать рабочее приложение наткнулся на проблемы..
<cut>
у меня лично компоненты не поперли, ИМХО не нужное усложнение, за что может нравится MVC- это за простоту и маленькое количество кода.
я использую UserControls и Html.RenderUserControl
Пример:
типовой Блог, список постов.
view блога:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/PersonalDetailed.Master" AutoEventWireup="true" CodeBehind="Blog.aspx.cs" Inherits="Web.Views.Personal.Blog"%>
<%@ Import Namespace="Web.Controllers.ViewData"%>
<%@ Import Namespace="Model"%>
<asp:Content ID="Content1" ContentPlaceHolderID="phMainContent" runat="server">
<%foreach (PostViewData post in ViewData.Model.Posts){ %>
<%=Html.RenderUserControl("~/Views/Personal/Controls/BlogPost.ascx", post ) %>
<%}%>
</asp:Content>
в RenderUserControl вторым параметром мы передаем _локальный_ для него ViewData.Model
такой контрол можно переиспользовать из любого места передав ему ЕГО ViewData.
наследование и связи между типизироваными ViewData, отдельная, очень интересная тема.
<%@ Import Namespace="Model"%>
<%@ Control Language="C#" AutoEventWireup="true" Inherits="Web.Views.Personal.Controls.BlogPost" %>
<% Model.Post p = ViewData.Model.Post; %>
<div style="background-color:Gray; padding:4px; margin-bottom:10px;">
<span class="blog_post-caption">
<%=Html.ActionLink(p.Title, "Post","Personal", new {username=ViewData.Model.CurrentUser.Login, language=p.Language, post_id=p.PostID} ) %>
</span >
<span class="blog_post-caption">
<%=p.Posted %>
</span >
<span class="blog_post-caption" align="right">
<%=Resources.MessageBase.blog_post_language_title +": " +p.Language %>
</span >
</div>
<div class="blog_post-body" style="padding-left:30px;padding-bottom:20px;" ><%=p.Content %></div>
<div style="text-align:right; background-color:#DDDDDD; padding:4px;margin-bottom:40px;" >
<%if ( ViewData.Model.Translations.Count()>0){ %>
Этот пост на:
<%foreach(Post ap in ViewData.Model.Translations){ %>
<%=Html.ActionLink(ap.Language, "Post","Personal", new {username=ViewData.Model.CurrentUser.Login, language=ap.Language, post_id=ap.PostID} ) %> |
<% }}%>
<%if ( ViewData.Model.AvailableTranslations.Count()>0 ){%>
Перевести на:
<%foreach(Language l in ViewData.Model.AvailableTranslations){ %>
<%=Html.ActionLink( l.display_name, "NewPost", "Personal", new { username = ViewData.Model.CurrentUser.Login
, language = l.code
, basePostId = p.PostID } ) %>
<% }}%>
</div>
namespace Web.Views.Personal.Controls
{
public partial class BlogPost : System.Web.Mvc.ViewUserControl<Web.Controllers.ViewData.PostViewData>{}
}
в идеале надо избавится от даже минималистического код бехайнда.
Re[2]: MVC: Размещение user controls в мастер пейдже.
Здравствуйте, mogadanez, Вы писали:
M>Здравствуйте, sonik, Вы писали:
S>>Доброго времени суток, я начал разбираться с MVC, стандартные примеры работают отлично, но как только начал пытаться сделать рабочее приложение наткнулся на проблемы..
M><cut>
M>у меня лично компоненты не поперли, ИМХО не нужное усложнение, за что может нравится MVC- это за простоту и маленькое количество кода.
видимо компоненты не поперли у всех, т.к. в preview 4 их не включили =)
вместо них предлагается использовать обычный метод контроллера который можно просто отрендерить где угодно:
mogadanez, твой подход очень смахивает на МоноРейлсовый подход ко вьюшкам... Там мне он нравиться, но я как-то не догадался применить его к обычным ASP .net страницам.
Спасибо за наводку.
Re[3]: MVC: Размещение user controls в мастер пейдже.
Здравствуйте, Aikin, Вы писали:
A>mogadanez, твой подход очень смахивает на МоноРейлсовый подход ко вьюшкам... Там мне он нравиться, но я как-то не догадался применить его к обычным ASP .net страницам. A>Спасибо за наводку.
еще все стоит посмотреть на Html.RenderAction в 4 Превью
причем не как на замену, а как доп фичу, например тут http://forums.asp.net/t/1303328.aspx показано как вместе использовать.
в целом можно сказать так:
Html.RenderUserControl — выделенный кусок вью, _связанный_(хотябы косвенно) с функциональностью текущего Action'a, и не требует ббольшого количества усили для подготовки данных. как в моем примере у нас _есть_ список постов, дополнительно ничего не нужно, на основании только этих данных можно уже отрендерить пост.
Html.RenderAction — _независимый_ кусок вьюшки. в этом случае накладно каждый раз, смотрим ссылку выше, для виджетов не слишком разумно готовить данные в каждом Action. поэтому логику и выносят в отдельный Controller/Action. сам по себе этот экшн может в результате также отрендерить Юзер контрол.
Re[2]: MVC: Размещение user controls в мастер пейдже.