在ASP.NET MVC中显示用户控件

时间:2010-09-18 04:02:22

标签: c# asp.net-mvc

在Web窗体中这似乎更容易;我有一个用户控件,代码隐藏中的逻辑,我可以把它放在页面上。

但显然代码隐藏在MVC中是禁忌,逻辑在控制器中。我对用户控件的逻辑如何“连线”感到有些困惑。

我想显示RSS Feed用户控件。所以我有一个页面:

<%@ 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);
}

但它去哪儿了?在包含控件的页面的控制器中?

4 个答案:

答案 0 :(得分:1)

根据我的理解......是的,它可以进入包含控件的页面中的控制器。 partial可以使用父的ViewModel

请参阅此处(部分视图上的位)

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

修改 包含您的RSS源 如果我的控制器名为RssController并且它有一个名为RssFeed的ViewResult方法,我会在.Master中包含以下内容。

这会导致调用RssController并返回部分视图(假设是View(rssData)发回的。

答案 1 :(得分:1)

在ASP.NET MVC 2+中,您可以使用Html.RenderAction以内联方式呈现操作的结果。

赋予操作[ChildActionOnly]属性将阻止用户正常导航到该操作,使其仅在此类“子”上下文中可用。

答案 2 :(得分: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,如果是,则跳过所有内容以使其不呈现任何内容。如果您现在就像现在这样离开它,如果发送的模型为空,它将以异常结束。

答案 3 :(得分:1)

我有一个模糊的类似问题(使用Razor视图引擎)我通过将代码放入页面解决了,因为我没有其他任何我想要的。我实际上与渲染菜单有关。

诀窍是使用@functions { ... }构造。

有关布局内容的一些相关信息:http://weblogs.asp.net/scottgu/archive/2010/10/22/asp-net-mvc-3-layouts.aspx

在你的情况下有点像这样(不完全正确;它已经很晚了,我不在我的开发盒上,但希望能提出这个想法)。这样你就不需要任何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);
             }
          }
        }