5

对不起,如果这是一个基本问题 - 我在从页面框架到 ASP.NET MVC 的心理转换时遇到了一些麻烦。

在页面框架中,我经常使用 ASCX 文件来创建小的、封装的功能块,这些功能块被包含在整个站点的各个位置。如果我正在构建一个页面并且我需要这些控件之一 - 我只需添加一个引用,一切都会正常工作。

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

如果是这样的话,对我来说似乎有点倒退了。这意味着,例如,我不能只是将控件“拖放”到母版页中,而不必向其视图使用该母版页的每个控制器添加代码!

我怀疑我错过了一些东西 - 任何帮助将不胜感激。

谢谢, - 克里斯

4

3 回答 3

3

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

是的。

但是,您可以在视图中使用RenderAction方法而不是RenderPartial,并且您的所有功能(包括传递给子视图的数据)都将被封装。

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

于 2009-11-07T00:43:12.050 回答
3

您的问题已经得到解答,但为了完整起见,有时您可能会觉得另一种选择很有吸引力。

您是否看到在 ASP.NET MVC 上如何屏蔽“控件”?它们是“HtmlHelper”的方法。例如,如果您想要一个绑定到“FirstName”的文本框,您可以执行以下操作:

<%= 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) %>)。

祝你好运!

于 2009-11-07T00:55:56.627 回答
1

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

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

在您的局部视图 (.ascx) 文件中,您可以使用“模型”对象(假设您在 @Control 减速中继承了正确的对象)对该对象执行您需要的任何操作。

当然,您可以不传递和建模,而只需获取局部视图的文本并将其放置在您想要的位置。

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

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

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

前面的方法所做的是调用控制器 Action,获取它的响应,并将其放置在您调用“RenderAction()”方法的位置。它相当于针对控制器操作运行请求并读取响应,除非您将响应放在另一个文件中。

谷歌“renderaction and renderpartial”获取更多信息。

于 2009-11-07T00:44:37.093 回答