ASP.Net MVC:创建自定义控件有点乱吗?

时间:2009-06-12 17:15:50

标签: asp.net-mvc controls

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

因此,我们的想法是使分页控制基本上不再需要在多个视图上输入几乎相同的标记。它是这样的:

 <%= 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}}, " ") %>

您可以看到我传递了所需的视图,控制器,路由名称,模型以及用于将请求变量添加到链接的URL的字典。

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

这是首选方式吗? ASP.Net方式的一个好处是标记到类,因为你有html标记标记,它将标记属性转换为类属性。它通常是为了更清晰的标记,但诚然“假”html。在这种情况下,我有一个方法,可能是一英里长的签名泵出HTML。由于我没有基本的WebControl类,因此我所做的每个控件都必须具有相同的基本需求,例如CssClass或ID。

现在有了这样说,我想我可以传入一个属性字典,因为     HtmlHelper.GenerateRouteLink 无论如何我正在使用的方法,但这看起来真的很麻烦。

有更好的方法吗?

4 个答案:

答案 0 :(得分:5)

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

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

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

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

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

答案 1 :(得分:2)

您可以将其置于局部视图中,而不是创建帮助程序。

答案 2 :(得分:1)

您可能需要查看Martijn Boland's Pager control以获取灵感。

就个人而言,对于我的可重用网格控件,我使用的类包含生成具有分页,排序的网格所需的所有信息,并且我调用部分视图来生成单独的元素(寻呼机,列选择,页面大小选择, ......),将他们需要的信息传递给他们。

这样我就可以使用自定义内容轻松扩展网格。例如,我可以创建一个Mygrid_editableTable.ascx视图来显示文本框而不仅仅是文本,并添加一个带有提交按钮的额外列。这继续使用分页,页面选择......

答案 3 :(得分:1)

我们最终使用html助手作为分页器,因为它们很容易进行单元测试。分页业务要求可能很挑剔。

“将少于35个链接显示为数字,然后按20秒分组,除非结果超过100页,在这种情况下按100分组...但在周四或GoogleBot上显示为...等“。

此外,我们的搜索引擎优化人员不断改变他们的想法,在哪些形状网站获得最多的果汁。在这种情况下,必须使用单元可测试的东西!