2010-09-18 153 views
0

在Web窗體中這似乎更容易;我有一個用戶控件,在代碼隱藏的邏輯,我可以把它放在一個頁面上。在ASP.NET MVC中顯示用戶控件

但顯然代碼屁股是一個沒有沒有在MVC中,並且邏輯在控制器。我對用戶控件的邏輯如何「連線」有點困惑。

我想顯示RSS提要用戶控件。所以我有一個頁面:

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

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

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <p> 
     <% Html.RenderPartial("RssFeed"); %> 
    </p> 
</asp:Content> 

我有我的用戶控件:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewPage<SyndicationFeed>" %> 
<%@ Import Namespace="System.ServiceModel.Syndication" %> 

<p> 
    <%: ViewData.Model.Title.Text %> 
</p> 

<div> 
    <% foreach (var item in ViewData.Model.Items) 
    { 
     string url = item.Links[0].Uri.OriginalString; 
    %> 
    <p><a href='<%= url %>'><b><%= item.Title.Text %></b></a></p> 

    <% } %> 
</div> 

而且我有這樣的代碼,我需要運行得到RSS數據:

using (XmlReader reader = XmlReader.Create(ConfigurationManager.AppSettings["RssFeed"])) 
{ 
    SyndicationFeed rssData = SyndicationFeed.Load(reader); 

    return View(rssData); 
} 

但它去哪裏?在包含該控件的頁面的控制器中?

回答

1

概括起來講,這是你如何做到這一點

[HttpGet, ChildActionOnly] 
// put this in RssController 
public ActionResult RssFeed() 
{ 
    // prepare the model 
    SyndicationFeed rssData; 
    using (XmlReader reader = XmlReader.Create(ConfigurationManager.AppSettings["RssFeed"])) 
    { 
     rssData = SyndicationFeed.Load(reader); 
    } 

    return PartialView(rssData); 
} 

用法:

<% Html.RenderAction("RssFeed", "Rss"); %> 

並把支票到您的ASCX如果您要發送的型號是空,如果是這樣,跳過一切,所以它不會呈現任何內容。如果您現在就離開它,如果發送的模型爲空,它將以異常結束。

+0

所以我得到一個編譯錯誤:無法將類型'ASP.views_shared_rssfeed_ascx'轉換爲'System.Web.Mvc.ViewUserControl'。這裏有什麼故事? – Steven 2010-09-18 18:36:27

+0

沒關係,在這裏找到答案:http://stackoverflow.com/questions/1028047/asp-net-mvc-custom-type-list-in-partial-view – Steven 2010-09-18 18:39:45

1

基於我的理解....是的,它可以進入包含控件的頁面中的控制器。局部可以使用父母的視圖模型

看到這裏(在局部視圖位)

http://msdn.microsoft.com/en-us/library/dd410123.aspx

編輯 要包括你的RSS提要 如果我的控制器命名RssController,它有一個的ViewResult方法名爲RssFeed,我會在.Master中包含以下內容。

這將導致RssController得到調用和返回查看您的部分(假設這就是視圖(rssData)送回。

+0

如果我想在母版頁中進行控制,該怎麼辦?主頁面上沒有真正的控制器,那麼它會去哪裏? – Steven 2010-09-18 04:29:09

+0

啊...我以爲你的樣品看起來有點奇怪。利梅捅了一下。 – 2010-09-18 04:41:42

+0

沒錯,我通常爲它創建一個特定的控制器,比如RssController或一個包含所有不會像ServiceController那樣的其他任何操作的控制器。我通常避免使用需要某些數據的控件來使用RenderPartial - 也就是說,我通常不使用接受模型的RenderPartial()的第二個重寫,而是使用RenderAction()爲控件準備數據,然後返回PartialView(模型) 。 – mare 2010-09-18 11:23:37

1

在ASP.NET MVC 2 +,你可以使用Html.RenderAction來渲染操作的結果在線。

給人一種[ChildActionOnly]屬性會阻止用戶導航到動作正常,使得它僅可使用在這樣的「子」方面的作用。

+0

這是您描述的使用案例。 – mare 2010-09-18 11:21:14

1

我有我通過將代碼放到頁面解決,因爲有沒有其他任何地方,我想說得含糊類似的問題(使用Razor視圖引擎)。我實際上與渲染菜單有關。

訣竅是使用@functions { ... }結構。

有關佈局的東西在這裏的一些相關信息:http://weblogs.asp.net/scottgu/archive/2010/10/22/asp-net-mvc-3-layouts.aspx

像這樣在你的案件種類(不完全正確的,它是晚,我不是在我的dev的盒子,但它希望給的想法)。這樣你就不需要任何RSS控制器,如果你只是做這一小部分的RSS相關的東西。

@foreach (var item in RssFeed().Items) 
{ 
    <p><a href='@item.Links[0].Uri.OriginalString'><b>@item.Title.Text</b></a></p> 
} 



@functions { 
     public SyndicationFeed RssFeed() 
      { 
      using (XmlReader reader = XmlReader.Create(ConfigurationManager.AppSettings["RssFeed"])) 
      { 
        return SyndicationFeed.Load(reader); 
      } 
      } 
     }