在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);
}
但它去哪儿了?在包含控件的页面的控制器中?
答案 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);
}
}
}