【问题标题】:Encapsulating User Controls in ASP.NET MVC在 ASP.NET MVC 中封装用户控件
【发布时间】:2009-11-07 00:35:56
【问题描述】:

抱歉,这是一个基本问题 - 我在从页面框架转换到 ASP.NET MVC 时遇到了一些麻烦。

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

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

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

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

谢谢, - 克里斯

【问题讨论】:

  • 不要说对不起,因为并非所有阅读此博客的读者都是 asp.net 或 mvc 专家
  • +1 为你的问题语法你编辑我的问题然后转到我的个人资料然后编辑我的问题,因为我不懂英语

标签: asp.net-mvc user-controls ascx


【解决方案1】:

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

是的。

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

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

【讨论】:

【解决方案2】:

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

您是否看到“控件”在 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: &lt;%= Html.EnumDropDown(Model.Gender) %&gt;)。

祝你好运!

【讨论】:

    【解决方案3】:

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

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

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

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

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

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

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

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

    谷歌“renderaction and renderpartial”了解更多信息。

    【讨论】:

    • 优秀 - RenderAction 是我所缺少的拼图!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2010-09-06
    • 2014-04-20
    • 2014-06-09
    • 1970-01-01
    相关资源
    最近更新 更多