gpt4 book ai didi

asp.net-mvc - ASP.NET MVC : Good Replacement for User Control?

转载 作者:行者123 更新时间:2023-12-04 02:03:51 26 4
gpt4 key购买 nike

我发现用户控件在使用 ASP.NET 网络表单时非常有用。通过使用标记封装显示控件所需的代码,可重用组件的创建非常简单且非常有用。

虽然 MVC 提供了方便的关注点分离,但这似乎破坏了封装(即,您可以在不添加或使用其支持代码的情况下添加控件,从而导致运行时错误)。每次向 View 添加控件时都必须修改 Controller ,在我看来似乎是为了整合关注点,而不是分离它们。我宁愿打破纯粹的 MVC 意识形态,也不愿放弃可重用的打包控件的好处。

我需要能够在整个站点中包含类似于 webforms 用户控件的组件,但不是针对整个站点,也不是在属于母版页的级别。这些组件应该有自己的代码,而不仅仅是标记(与业务层交互),如果页面 Controller 不需要了解控件,那就太好了。由于 MVC 用户控件没有代码隐藏,因此我看不到这样做的好方法。

更新
最后,一个很好的(回想起来,很明显)方法来实现这一点。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace K.ObjectModel.Controls
{
public class TestControl : ViewUserControl
{
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
writer.Write("Hello World");
base.Render(writer);
}
}
}

创建一个继承 ViewUserControl 的新类

覆盖 .Render()方法如上图。

就像在 webForm 中一样,通过关联的 ASCX 注册控件:
<%@ Register TagName="tn" TagPrefix="k" Src="~/Views/Navigation/LeftBar.ascx"%>
在您需要的任何 View 或母版页中使用相应的标记:
<k:tn runat="server"/>
确保您的 .ascx 继承您的新控件:
<%@ Control Language="C#" Inherits="K.ObjectModel.Controls.TestControl" %>
瞧,你已经启动并运行了。这是使用 ASP.NET MVC 2、VS 2010 和 .NET 4.0 测试的。

您的自定义标记引用 ascx 部分 View ,该 View 继承自 TestControl 类。然后控件将覆盖 Render()方法,调用该方法来呈现 View ,让您完全控制从标记到输出的过程。

使用这种方法和调用 Html.RenderPartial() 的区别或者 `Html.RenderAction()' 将控件添加到 View 是使用类似 webforms 的标记完成的,这不仅对设计人员来说更舒适,而且使他们不必知道 Controller 名称和方法。控件类的名称与 ASCX 隔离,也使得将它们放入程序集中并在不同的项目中重用它们变得更容易。

有人可能会说这违反了 SoC,但我相信这种方法在功能上等同于将局部 View 和 Controller 捆绑在一起,同时保持干净的标记。然而,应该清楚的是,仍然由开发人员在控制中只保留与表示相关的逻辑。业务和数据访问逻辑仍然属于它们各自的层。

最佳答案

我在这里有点困惑。

首先,与用户控件等效的 .NET MVC 是 Partial Views .部分 View 是将常用 View 功能封装在单个位置的便捷方式。然后,您可以从另一个 View 中调用局部 View 。

其次,修改 View 不应该意味着也修改 Controller 。如果仅仅因为您的 View 更改(而不是基础数据)而需要对两者进行更改,那么沿线某处存在代码问题。

关于asp.net-mvc - ASP.NET MVC : Good Replacement for User Control?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2804630/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com