Доступ к моделям MVC из стандартного ASCX UserControl - PullRequest
0 голосов
/ 15 марта 2011

У меня есть простой пользовательский элемент управления ASCX (не MVC).У пользовательского элемента управления есть свойство (назовем его Title или что-то в этом роде).

У меня также есть частичное представление MVC, которое содержит пользовательский элемент управления.

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeModel>" %>
<%@ Register TagPrefix="tag" TagName="Control" Src="~/path/to/ascx/control.ascx" %>
... snip ...
<tag:Control ID="myControl" runat="server" />

What I 'Я хотел бы иметь возможность сделать что-то вроде этого:

<tag:Control ID="myControl" runat="server" Title="<%= Model.Title %>" />

... так что я могу получить доступ к некоторому свойству модели внутри моего элемента управления.К сожалению, этот метод не работает, так как я получаю сообщение «Это не скриптлет. Будет выводиться как обычный текст».

Возможно ли то, что я пытаюсь сделать, даже возможно?Если да, у кого-нибудь есть идеи, как я могу это сделать?

Если это актуально, то это проект .Net 4 с компонентами MVC 2.

Спасибо!Neil

Ответы [ 2 ]

2 голосов
/ 15 марта 2011

Возможно ли то, что я пытаюсь сделать?

Да, но это было бы крайне уродливо , и это предполагает использование кода (в виде ASP.NET MVC !!!):

<%@ Page 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="AppName.Views.Home.Index" 
    CodeBehind="Index.aspx.cs" 
%>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Home Page
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <asp:Label ID="Txt" runat="server" />
</asp:Content>

и в соответствующем коде за Index.aspx.cs (beurk ..., я буду рвать):

public partial class Index : System.Web.Mvc.ViewPage<AppName.Models.MyViewModel>
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Txt.Text = Model.Title;
    }
}

, который можно улучшить следующим образом, чтобы избежать бессмысленного кода:

<%@ Page 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<AppName.Models.MyViewModel>" 
%>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        Txt.Text = Model.Title;
    }
</script>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Home Page
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <asp:Label ID="Txt" runat="server" />
</asp:Content>

Я бы не рекомендовал вам делать что-то подобное, если вы собираетесь однажды перейти на ASP.NET MVC 3 и Razor View Engine.

0 голосов
/ 06 июля 2011

Я нашел решение, которое немного чище.Все еще не по душе, но достаточно хорош, чтобы умыть руки от этой надоедливой проблемы.

<% ViewBag.Item = item; %>

<gc:Ribbon runat="server">
    <Content>
        <strong><%= ViewBag.Item.DataItem.Name %></strong>
    </Content>
</gc:Ribbon>

Вместо того, чтобы передавать объект в пользовательский элемент управления для использования внутри, назначьте его ViewBag (для каждой итерации, еслиВы зацикливаетесь), и используете это глобально.Если память мне не изменяет, я полагаю, что MVC 2 использует ViewData ["свободно набранное имя"] вместо динамического ViewBag.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...