Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc Net MVC:创建自定义控件有点混乱?_Asp.net Mvc_Controls - Fatal编程技术网

Asp.net mvc Net MVC:创建自定义控件有点混乱?

Asp.net mvc Net MVC:创建自定义控件有点混乱?,asp.net-mvc,controls,Asp.net Mvc,Controls,主要问题:是否有更好的方法来完成创建可重用控件 因此,我们的想法是使分页控件基本上不必在多个视图上键入几乎相同的标记。就拿这个来说: <%= Html.ActionLink("First", "Details", new RouteValueDictionary(new { parentForumId = Model.TopicId, pageNumber = Model.FirstPage, amountToShow = Model.AmountToShow }))%> |

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

因此,我们的想法是使分页控件基本上不必在多个视图上键入几乎相同的标记。就拿这个来说:

 <%= 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.GeneratorOutElink 我使用的方法无论如何都会调用一个,但这看起来真的很混乱


有更好的方法吗?

你可能想从中获得一些灵感

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


通过这种方式,我可以轻松地使用自定义内容扩展网格。例如,我可以创建一个Mygrid_editableTable.ascx视图来显示文本框,而不仅仅是文本,并使用submit按钮添加一个额外的列。在继续使用分页、页面选择等功能的同时,您可以将其放在局部视图中,而不是创建帮助程序。

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

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

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

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


至于一英里长的签名位…搜索一下(试试Bing.com!)流畅的界面和HtmlHelper。流畅的风格开始在MVC视图这样的环境中占据重要地位,因为在这些环境中,您可能会有大量的签名。总体思路是基于方法链接,有点像jQuery,可以将这些长签名缩短为一系列更短、更有意义的链接方法调用,这些方法调用设置html帮助程序,最后调用.Render方法或类似的方法

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

“将少于35个链接显示为数字,然后按20秒分组,除非结果超过100页,在这种情况下,按100秒分组……但在周四或谷歌机器人上,将它们显示为……等等。”


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

是的,我就是这么做的(Noland的寻呼机),因为我有一个模型基类,它保存下一个页码和最后一个页码。视图本身是使用该模型类“键入”的。将按照Robert Harvey和您的建议查看部分视图。幸运的是,现在它只是一个简单的第一件事、上一件事、下一件事、最后一件事,所有这些都在控制器上完成,页码值通过模型发送。不过我明白你的意思。