2011-03-15 3 views
0

간단한 ASCX 사용자 컨트롤 (MVC가 아닌)이 있습니다. 사용자 정의 컨트롤에 속성이 있습니다 (제목 또는 기타 항목이라고 부름).표준 ASCX UserControl에서 MVC 모델에 액세스

나는 또한 사용자 정의 컨트롤을 포함하고있는 MVC Partial View를 가지고있다. 내 컨트롤 내부에 모델의 일부 속성에 액세스 할 수 있도록 ...

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

: 내가 할 수 있도록하고 싶습니다 무엇

<%@ 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" /> 

이 같은 것입니다. 불행히도 "이 스크립트는 일반 텍스트로 출력됩니다."라는 메시지가 표시되므로이 방법이 작동하지 않습니다.

내가 할 수있는 일이 가능한 것일까 요? 그렇다면 누구나 시도하고 수행 할 수있는 아이디어가 있습니까?

관련이 있다면 MVC 2 구성 요소가있는 .Net 4 프로젝트입니다.

감사합니다. Neil

답변

2

내가 할 수있는 일이 가능한 것일까 요?

네하지만 매우 추한 것 그리고 뒤에 코드를 사용하는 것 (AN 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 뷰 엔진으로 하루를 마이그레이션하려는 경우 이와 같은 작업을하지 않는 것이 좋습니다.

+0

와우, 그건 못 생겼어/교활 :) 네 도움을 많이 주셔서 감사합니다 ... 나는 이것을 시도하고 다른 방법을 찾으십시오. – NeilD

0

조금 더 깨끗한 해결책을 찾았습니다. 아직도 내 마음에 들지는 않지만,이 성가신 문제를 해결할만큼 충분히 좋다. 대신, 내 사용 (당신이 반복하는 경우 각 반복의 경우) ViewBag에 할당하고, 전 세계적으로 그것을 사용하는 사용자 컨트롤에 객체를 전달

<% ViewBag.Item = item; %> 

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

. 메모리가 제대로 작동한다면 MVC 2는 동적 ViewBag 대신 ViewData [ "loosely typed name"]을 사용합니다.

관련 문제