2010-09-18 155 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); 
      } 
      } 
     }