ASP.Net MVC 框架是否有与 Monorail 视图组件等效的组件?

2023-12-21

我大量使用查看组件 http://ayende.com/Blog/archive/2007/04/08/Building-View-Components-For-MonoRail.aspx在我用 Monorail 构建的一些大型应用程序中 - ASP.Net MVC 中用于视图组件的等效方法是什么,可以支持部分等?


实际上,您有多种选择来创建 ASP.NET MVC 中的 ViewComponent 的等效项,具体取决于组件的复杂性。我使用这两种方法,这是我所知道的更 mvc 风格的方法。

1:最简单的事情是创建一个 ViewUserControl 并使用 Html.RenderPartial 和帮助程序显示它。 ViewUserControl 是一个简单的标记,没有后备控制器(我认为如果需要,您可以放置​​一个代码隐藏文件)。 或者,您可以在调用 RenderPartial 时将模型对象或整个 ViewData 字典传递给视图,如下所示:

<% Html.RenderPartial("TopBar", model); %>

“TopBar”是一个 ascx 页面。这适用于任何地方,在母版页和普通视图中。

2: 如果您希望组件具有更复杂的逻辑或访问数据源、IoC 等,那么您可以使用 Html.RenderAction,它是 Microsoft.Web.Mvc 程序集中的扩展方法。我正在使用 mvccontrib 发行版中的这个。它的工作原理是这样的,您需要创建一个包含您需要的所有逻辑的普通控制器,然后创建一些视图,所有这些东西都成为您的组件,例如:

public class AboutComponentController : Controller {
public IRepository Repository{ get; set; }

public ActionResult Detail() {
    var lastEvent = Repository.FindAll<Auditoria>().FirstOrDefault();
    return View(lastEvent);
}

}

请注意,我如何引用将要注入 IoC(在我的例子中为 Windsor)的 IRepository,并且我可以执行普通控制器会执行的任何操作。

现在,在您想要使用组件的任何页面(主页面或普通页面)中,导入 Microsoft.Web.Mvc 并使用适当的参数调用 Html.RenderAction。这将创建一个迷你 mvc 管道,用于创建控制器、解析视图等,就像 Monorail ViewComponent 一样。我更喜欢使用基于 lambda 的方法变体,如下所示:

<% Html.RenderAction<AboutComponentController>(x => x.Detail("a message"));%>

不幸的是,传递参数的唯一方法是使用方法调用本身,而方法调用本身在控制器中必须是唯一的。仍然需要一些工作来类似于 ViewComponent。

我不在组件的视图中使用母版页或布局,因为它们本身就是组合元素。

请记住,在使用 Webforms 视图引擎时,如果您希望在代码块中使用 Model 变量时具有智能感知功能,则可以使用强类型视图。

这样做的好处在于,您可以将视图引擎与这些方法混合使用,我通常在 nvelocity 中创建组件并将它们显示在 aspx 页面等中。

我现在可能存在缓存部分视图的问题,但到目前为止我还没有遇到任何问题。我确信还有其他选项(例如 mvccontrib 中的子控制器),但这通常足以满足简单的情况。当然,您可以在 aspx 视图页面中使用普通的 ASP.net 组件,但这会是作弊,对吧?呵呵。我希望它有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.Net MVC 框架是否有与 Monorail 视图组件等效的组件? 的相关文章

随机推荐

  • 在 Blazor 视图之外访问经过身份验证的用户

    在我的服务器端 Blazor 应用程序中 身份验证以非常规的方式处理 本质上 当用户访问该页面时 他们将使用其 Windows 凭据进行身份验证 此时 将创建一个自定义策略来在外部数据库 Informix 中查找该用户名 在该数据库中可以找
  • 如何在 Android 中滑动视图时禁用 onclick 侦听器?

    我有一个可以滑动到另一个页面的视图 它有一个 onClick 侦听器 用于显示一个对话框 问题是 滑动会触发这两个操作 即显示下一页和对话框 如何在滑动时禁用 onClick 侦听器 听起来你想使用 GestureDetector as w
  • DiffableDataSource:快照不会重新加载页眉和页脚

    我在用UICollectionViewDiffableDataSource for UICollectionView以多个部分显示内容 我正在使用 Collection View Compositional Layout 和 Diffabl
  • 如何通过堆栈跟踪访问本地变量? (模仿动态范围)

    背景 尽管可以在运行时编译 C 代码 但不可能在当前作用域中包含并运行生成的代码 相反 所有变量都必须作为显式参数传递 与 Python 这样的动态编程语言相比 我们永远无法真正复制eval 如本例所示 x 42 print eval x
  • 显示 node.js child_process.exec 的进度?

    我最近提出 接受了我之前提出的问题的答案 如何使用 Node js 复制 wget 的功能 https stackoverflow com questions 9541177 how can i replicate the function
  • 如何在 C++ 中访问数字的符号位?

    我希望能够访问 C 中数字的符号位 我当前的代码看起来像这样 int sign bit number gt gt 31 这似乎有效 给了我0对于正数和 1对于负数 但是 我不明白我是如何得到的 1对于负数 如果 12 是 0000 0000
  • 向 y 轴添加标签以显示 matplotlib 中水平线的 y 值

    如何将字符串标签添加到下图中显示的水平红线 我想将 k 305 之类的内容添加到该行旁边的 y 轴标签中 蓝点只是一些其他数据 其值并不重要 为了重现这个问题 您可以绘制任何类型的数据 我的问题是关于红线的 plt plot 0 502 3
  • iPhone - SKProductsRequest 和“消息发送到已解除分配的实例”

    我在实施 InAppPurchase 时遇到了麻烦 我的购买实现是在模态视图控制器 AppUpgradeViewController 中实现的 我从另一个模态视图中呈现它 我这样做 AppUpgradeViewController appU
  • Android 禁用列表视图项目

    所以基本上我需要一些帮助或一些关于我遇到的问题的建议 我正在从数据库填充列表视图 并且需要在创建列表视图时检查该项目的 id 是否已打开position与我数据库中另一个表的 id 相同 如果是 您可以单击该项目 如果不是 我希望它禁用它
  • 当鼠标在 JFrame 内移动时,Swing Timer 停止调用 actionPerformed()

    如果我将鼠标移入javax swing JFrame the javax swing Timer停止呼叫actionPerformed 方法 直到鼠标停止移动 仅当我使用 Rocket Kone XTD 鼠标移动光标时才会出现这种情况 当我
  • 重启CF服务器会导致所有人退出吗?

    如果CF服务器重新启动 所有现有的Session和Client变量是否都会丢失 客户端变量通常存在于数据库或注册表中 因此它们在服务器重新启动后仍然存在 请参阅here http help adobe com en US ColdFusio
  • 所有单元测试都用 Moq 抛出 BadImageFormatException 吗?

    我目前正在增加我们软件产品的代码覆盖率 但遇到了一个问题 我的所有单元测试 当使用 任何 CPU 编译时 都因抛出 BadImageFormatException 而失败 可以通过使用 x86 而不是 任何 CPU 构建解决方案来规避此异常
  • Xcode - 使用#pragma 标记

    我很确定这不是重复的 你使用 pragma 标记吗 我看了很多方法 哪个是正确的 pragma mark pragma mark Actions pragma mark pragma mark pragma mark Actions pra
  • : 在 vi​​m 中用全颜色方案硬拷贝一个文件

    我想使用全彩打印我在 MacVIM 中编辑的一些文件 包括深色背景 当然我不会将其发送到打印机 我只想将其保存为PDF hardcopy 删除背景并应用丑陋的方案 是否可以 而是使用 TOhtml 这是一个通常包含在默认 Vim 运行时中的
  • boost::bind 的返回类型是什么?

    我想将函数的 绑定器 保存到变量中 以便通过利用其运算符重载功能在以下代码中重复使用它 这是实际执行我想要的操作的代码 include
  • statsmodels“LinAlgError:奇异矩阵”中的逻辑回归

    不知道为什么 但在拟合逻辑回归模型时出现 numpy linalg linalg LinAlgError 奇异矩阵 错误 from sklearn datasets import load breast cancer from sklear
  • 具有流源的查询必须使用 writeStream.start();; 执行

    我正在尝试使用 Spark 结构化流从 Kafka 读取数据并预测传入数据 我正在使用使用 Spark ML 训练过的模型 val spark SparkSession builder appName Spark SQL basic exa
  • 从内核态写入文件

    我想从内核空间写入日志文件 我可以创建 打开和关闭文件 var log my kern module log 但如果我尝试写入某些内容 我的模块就会崩溃 所以我知道从内核空间读 写文件是不好的 但我必须这样做它在这个模块中 您有什么建议可以
  • 用于验证地址的 JavaScript 正则表达式

    我想使用正则表达式验证 JavaScript 中的居住地址 但我对正则表达式了解不多 我尝试过构建自己的正则表达式 a zA Z s d 但它似乎无法正常工作 我想要实现的是允许字母 空格和至少一个数字 这是必需的 并且还应该可以插入斜杠
  • ASP.Net MVC 框架是否有与 Monorail 视图组件等效的组件?

    我大量使用查看组件 http ayende com Blog archive 2007 04 08 Building View Components For MonoRail aspx在我用 Monorail 构建的一些大型应用程序中 AS