2009-11-07 72 views
5

对不起,如果这是一个基本问题 - 我在从页面框架转换到ASP.NET MVC时遇到了一些麻烦。在ASP.NET MVC中封装用户控件

在页面框架中,我经常使用ASCX文件来创建小型封装的功能块,这些功能块在整个站点的各个位置都会出现。如果我正在构建一个页面,并且需要这些控件之一 - 我只需添加一个引用,并且所有内容都可以正常工作。

据我所知,在MVC中,ASCX文件只是部分视图。这是否意味着无论我想添加这些功能单元中的哪一个,我还必须向控制器的操作方法添加一些代码以确保相关的ViewData可用于ASCX?

如果是这样的话,那对我来说似乎有点退步了。举例来说,这意味着我不能将控件“放置”到主页面中,而无需将代码添加到其视图使用该主页面的每个控制器!

我怀疑我错过了什么 - 任何帮助将不胜感激。

谢谢, 克里斯 -

+0

不要说抱歉,因为这不是真的,所有阅读此博客的读者都是asp.net或mvc专家 – 2009-11-07 00:47:06

+0

+1对于您的问题语法是你编辑我的问题,然后去我的个人资料,然后编辑我的问题,因为我在英语方面没有很好的知识 – 2009-11-07 00:49:17

回答

3

据我所知,在MVC中,ASCX 文件只是一个局部视图。这是否 意味着,只要我想补充一个 的功能,这些单位我也 有一些代码添加到 控制器的操作方法,使 确保相关的ViewData的是 可供ASCX?

是的。

不过,您可以在您的视图,而不是RenderPartial使用RenderAction方法,以及您的所有功能(包括数据被传递到子视图)将被封装。

换句话说,这将创建一个包含控制器方法,视图数据和局部视图的小包,可以在主视图中用一行代码调用它。

+0

优秀 - RenderAction是我错过的难题!非常感谢! – 2009-11-07 00:50:44

+0

也可以看看这篇文章http://blog.codeville.net/2008/10/14/partial-requests-in-aspnet-mvc/的一些其他选择。 – joshperry 2009-11-07 00:51:33

+0

下面是RenderAction的更好的概述:http://blogs.intesoft.net/post/2009/02/renderaction-versus-renderpartial-aspnet-mvc.aspx – 2009-11-07 01:00:05

1

您可以渲染局部视图并将模型对象传递给。

<% Html.RenderPartial("MyPartial", ViewData["SomeObject"]); 

在您的局部视图(的.ascx)文件,然后您可以使用“模型”对象(假设你已经继承了你的@控制减速正确的对象)做任何你需要与该对象。

你可以,当然,不通过和模型,只是采取局部视图的文本,并将其放在你想要的地方。

在您的主视图(.aspx文件)中,您需要在ViewData中定义传递给部分视图的正确对象。

你可以做的另一种方法是使用:

<% Html.RenderAction("MyAction", "MyController", new { Parameter1="Value1"}) %> 

什么以前的方法所做的就是调用控制器动作,接受其响应,并把它放在你叫“的RenderAction()”方法。它相当于对控制器动作运行请求并读取响应,除了将响应放在另一个文件中。

谷歌“renderaction和renderpartial”的一些更多的信息。

+0

优秀 - RenderAction是我失踪的难题!非常感谢! – 2009-11-07 00:50:09

2

您的问题已经得到解答,但仅仅为了完整性,您还可以选择其他选项。

你见过在ASP.NET MVC上如何屏蔽“控件”吗?他们是“HtmlHelper”的方法。如果你想绑定到“姓”文本框,例如,你可以这样做:

<%= Html.Textbox("FirstName") %> 

而且你有这样的事情对于许多标准控件。

你可以做的是创建你自己的方法。要创建自己的方法,你必须对HtmlHelper类创建扩展方法,像这样:

public static class HtmlHelperExtensions 
{ 
    public static string Bold(this HtmlHelper html, string text) 
    { 
     return "<b>" + text + "</b>\n"; 
    } 
} 

然后在您的视图,打开包含这个类定义的命名空间后,您可以使用它像这样:

<%= Html.Bold("This text will be in bold-face!") %> 

那么,这不是特别有用。但是你可以做很有趣的事情。我经常使用的一种方法是枚举并使用此枚举值创建一个下拉列表(例如:enum Gender { Male, Female },在视图中类似于Gender: <%= Html.EnumDropDown(Model.Gender) %>)。

祝你好运!