asp.net-mvc - ASP.Net MVC : Creating custom controls kind of messy?

标签 asp.net-mvc controls

主要问题:是否有更好的方法来完成创建可重用控件?

因此,我们的想法是制作一个分页控件,从而基本上不再需要在多个 View 上输入几乎相同的标记。它正在采取这个:

 <%= Html.ActionLink("First", "Details", new RouteValueDictionary(new { parentForumId = Model.TopicId, pageNumber = Model.FirstPage, amountToShow = Model.AmountToShow }))%>
 | 
 <%= Html.ActionLink("Previous", "Details", new RouteValueDictionary(new { parentForumId = Model.TopicId, pageNumber = Model.PreviousPage, amountToShow = Model.AmountToShow }))%>
 |
 <%= Html.ActionLink("Next", "Details", new RouteValueDictionary(new { parentForumId = Model.TopicId, pageNumber = Model.NextPage, amountToShow = Model.AmountToShow }))%>
 |
 <%= Html.ActionLink("Last", "Details", new RouteValueDictionary(new { parentForumId = Model.TopicId, pageNumber = Model.LastPage, amountToShow = Model.AmountToShow }))%>

然后把它变成这样:

<%= Html.Pager("View", "Controller", "RouteName", Model, new Dictionary<String, Object> { {"parentForumId", Model.ParentForumId}}, " ") %>

如您所见,我传入了所需的 View 、 Controller 、路由名称、模型和用于将请求变量添加到链接的 url 的字典。

我发现我必须为 HtmlHelper 类创建一个扩展方法,并且基本上采用 ASP.Net 中的完整类(具有像 CreateChildControls 这样的好方法)并将其全部塞入一个主要方法中,该方法返回一个字符串。

这是执行此操作的首选方法吗? ASP.Net 方式的一个好处是对类进行标记,因为您拥有将标记属性转换为类属性的 html 标记。它通常用于更清晰的标记,但不可否认是“假”html。在这种情况下,我有一个方法可以将一英里长的签名抽出 html。由于我没有基本的 WebControl 类,我制作的每个控件都必须具有具有相同基本需求的方法调用,例如 CssClass 或 ID。

话虽这么说,我想我可以传入一个属性字典,因为 HtmlHelper.GenerateRouteLink 无论如何我正在使用的方法调用一个,但这看起来真的很乱。

有更好的方法吗?

最佳答案

首先,它都是 ASP.NET...一个是 MVC,另一个是 WebForms。当您一直说“ASP.NET 方式”时,我花了几秒钟才意识到您在说什么。 :P

MVC 的想法是您的 View 是“愚蠢的”,除了呈现数据的绝对骨架基础之外没有任何实际行为。在 WebForms 中, View 与呈现它们和处理 View 事件的行为紧密相关。这虽然方便,但使得 WebForms View 很难进行单元测试,因为 View 内容和行为是链接的,有时是混合的。

MVC View 使用 HtmlHelper 和 AjaxHelper 之类的东西的原因是尽可能将行为与 View 分开。与 WebForms 中的用户或服务器控件不同,您可以对 Html.Pager 扩展方法进行完全单元测试,因为逻辑是纯代码,无需混合这些 UI 问题或链接到一堆不可测试的 UI 级别类型。同样的一般规则适用于 MVC Controller ......它们只是代码,没有链接到事件或类似的东西。

它在短期内可能不太方便,因为您目前已经习惯了旧的 WebForms 做事方式。不过,给自己一些时间,您可能会开始意识到 MVC 首选的处理方式带来的好处。在 HtmlHelper 上编写 Pager 扩展方法确实是使用 MVC 做事的首选方式。

至于一英里长的签名位...搜索(试试 Bing.com!)流畅的样式界面和 HtmlHelper。流畅的风格开始在像 MVC View 这样的环境中占有一席之地,在这些环境中,您可能会拥有巨大的签名。一般的想法是基于方法链,有点像 jQuery,并且可以将那些长签名缩短为一系列更短和更有意义的链式方法调用,这些方法调用设置你的 html 助手,最后调用 .Render 方法或其他东西相似的。

关于asp.net-mvc - ASP.Net MVC : Creating custom controls kind of messy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/987879/

相关文章:

.net - 你能得到剪切控件的可见区域的大小吗?

asp.net-mvc - 我应该如何保护我的 SPA 和 Web.API?

jquery - 返回 Json 会导致 asp.net mvc 中的保存文件对话框

visual-c++ - 如何在Visual C++中控制鼠标移动?

c# - 您有使用 ASP.NET MVC 的 CascadingDropDown 吗?

Java - KeyListener 多个按钮按下

winapi - 如何在 Win32 中为分组框控件着色?

c# - ASP.Net MVC Controller 看不到另一个命名空间

javascript - 如何使用 MVC 5 中数据库中的值进行自动完成?

.net - 您认为 ASP.NET WebForms 是一种不好的做法吗?