MVC: Размещение user controls в мастер пейдже.
От: sonik  
Дата: 10.06.08 07:08
Оценка:
Доброго времени суток, я начал разбираться с MVC, стандартные примеры работают отлично, но как только начал пытаться сделать рабочее приложение наткнулся на проблемы..

Мне нужно разместить в мастер пейдже свой контролл — например комбобокс контрол выбора языка.. или текстовое поле с кнопкой — неважно, покопавшись в гугле нашел такой вариант — создаем отдельный контроллер для нашего компонента унаследовав его от
class LanguageController : ComponentController


код компонента

<form action="/Language/ChangeLanguage" method="post">
    <%= Html.DropDownList( "LanguageList", ViewData.Model ) %>    
    
    <input type="submit" value="ChangeLanguage" />
</form>


В мастер пейдже этот контрол подключаеться так <%= 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 в мастер пейдже.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 10.06.08 07:38
Оценка:
Здравствуйте, sonik, Вы писали:

S>Доброго времени суток, я начал разбираться с MVC, стандартные примеры работают отлично, но как только начал пытаться сделать рабочее приложение наткнулся на проблемы..


S>Мне нужно разместить в мастер пейдже свой контролл — например комбобокс контрол выбора языка.. или текстовое поле с кнопкой — неважно, покопавшись в гугле нашел такой вариант — создаем отдельный контроллер для нашего компонента унаследовав его от
class LanguageController : ComponentController


S>код компонента


S>
S><form action="/Language/ChangeLanguage" method="post">
S>    <%= Html.DropDownList( "LanguageList", ViewData.Model ) %>    
    
S>    <input type="submit" value="ChangeLanguage" />
S></form>
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 в мастер пейдже.
От: sonik  
Дата: 10.06.08 08:16
Оценка:
Здравствуйте, 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 в мастер пейдже.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 10.06.08 08:24
Оценка: 2 (1)
Здравствуйте, 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 в мастер пейдже.
От: mogadanez Чехия  
Дата: 05.08.08 07:53
Оценка: 25 (3)
Здравствуйте, 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 Чехия  
Дата: 07.08.08 08:01
Оценка:
Здравствуйте, mogadanez, Вы писали:

M>Здравствуйте, sonik, Вы писали:


S>>Доброго времени суток, я начал разбираться с MVC, стандартные примеры работают отлично, но как только начал пытаться сделать рабочее приложение наткнулся на проблемы..


M><cut>


M>у меня лично компоненты не поперли, ИМХО не нужное усложнение, за что может нравится MVC- это за простоту и маленькое количество кода.


видимо компоненты не поперли у всех, т.к. в preview 4 их не включили =)
вместо них предлагается использовать обычный метод контроллера который можно просто отрендерить где угодно:

<%Html.RenderAction<HomeController>(n => n.About()); %>



http://forums.asp.net/t/1299277.aspx#2530854
Re[2]: MVC: Размещение user controls в мастер пейдже.
От: Aikin Беларусь kavaleu.ru
Дата: 07.08.08 08:30
Оценка:
mogadanez, твой подход очень смахивает на МоноРейлсовый подход ко вьюшкам... Там мне он нравиться, но я как-то не догадался применить его к обычным ASP .net страницам.
Спасибо за наводку.
Re[3]: MVC: Размещение user controls в мастер пейдже.
От: mogadanez Чехия  
Дата: 12.08.08 08:57
Оценка:
Здравствуйте, 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 в мастер пейдже.
От: mogadanez Чехия  
Дата: 14.08.08 12:57
Оценка:
M>в идеале надо избавится от даже минималистического код бехайнда.

это кстати возможно... вот нашел:
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=104071
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.