使用HTMLHelpers减少代码重复二个观点。代理视图-由验证信息的人填写的表格。此视图中表单上的每个字段都有3个子字段:原始值——调用b之前数据库中的值。新价值–手机提供的价值,如果它与原始手机不同。C。行动——发生事件的一般指示QC视图——由审查在代理视图中执行的工作的人填写的表格。此视图中表单上的每个字段都有5个子字段:原始值——与上述b相同。代理值——上述1b中代理提供的值。C。QC值-如果代理指定的值不正确,则更正“新值”。d.代理操作-与上述相同,但在此视图中为只读,即QC操作-如果代理选择不当,则更正“新操作”。两个视图之间的唯一区别是可用的子字段。我希望能够使用一个视图来表示两个视图,因为页面的整体结构是相同的,只需使用HTML帮助程序来处理子字段中的差异。到目前为止,我有两个不同的助手家族(目前属于同一类,但可以分开)://AgentcontrolspublicstaticMvcHtmlStringAuditControl(thisHtmlHelperhtmlHelper,stringid,stringfieldLabel,MvcHtmlStringeditControl,stringcssClass)public静态MvcHtmlStringAuditControl(此HtmlHelperhtmlHelper、字符串id、字符串fieldLabel、字符串editControl、字符串cssClass)ReviewControl(这个HtmlHelperhtmlHelper,字符串id,字符串fieldLabel,MvcHtmlStringeditControl,字符串cssClass)cssClass)whereCOMPLEX:AbstractComplex,new()第三种实现处理多数据更复杂的字段(如全名、地址等)我考虑过的一种可能的解决方案是将不同类型的控件分离到实现通用接口的不同类中,然后将它们作为类型参数传递给更通用的HTML帮助程序。我认为这可行,但我会以某种方式告诉视图它应该使用哪个实现来绘制视图,这似乎有问题,因为它似乎模糊了视图和控制器之间的界限。一种不太吸引人但似乎很明显的方法是从控制器传递一种管理标志,该标志将由泛型(逻辑上的泛型而不是泛型类型)工厂助手使用,并在其中构建逻辑以了解要使用哪个系列的方法。这将使模型和视图保持分离,但感觉很脏,因为HTML帮助器将不仅仅负责构建HTML。这是打破MVC设计的关注点分离的合理情况还是有更合适的解决方案?由于您使用的是MVC3,我建议对子字段使用子操作:http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx子操作允许您在视图内的控制器上执行此操作它,这将是一种更清洁的方法。我能够非常简单地实现(我的解释)@SoWeLie建议的内容。它涉及创建一个新模型来保存可能的控件属性超集,并为每组不同的控件绘制一个新视图(一个用于审核,一个用于审核)。它的问题是生成的ViewAPI很丑陋:@Html.RenderAction("DrawControl",new{id="ID"...})//对DrawControl的所有重载重复每个控制器操作包含以下内容:publicActionResultDrawControl(stringid,...){//FieldControl是我模型的名称varviewModel=newFieldControl(){ID=id,...};如果(shouldRenderAudit)返回PartialView("AuditControl",viewModel);否则返回PartialView("ReviewControl",viewModel);我不知道如何让我的通用助手在这种情况下工作,而且,我想删除明显的代码重复,所以这很快就变成了:@functions{publicstringDrawControl(stringid,...){returnHtml.Render("DrawControl",new{id="ID"});}//重复DrawControl的所有重载}@DrawControl("ID",...)使用相同的控制器操作。这个问题(忽略View功能齐全的事实)是@functions块必须包含在任何想要使用它们的视图中(目前只有2个,但很快就会膨胀到5个,谁知道我的前任会做什么这是什么?我很快又重新编写了代码,这次是为了恢复helper(通常保持视图、模型和控制器的变化),最后是这样的:View:@(Html.DrawComplexControl("id",...))@Html.DrawSimpleControl("id",...)Controller://一个用于确定应绘制哪个控件的常见操作publicActionResultDrawControl(FieldControlmodel){if(shouldRenderAudit)returnPartialView("AuditControl",model);elsereturnPartialView("ReviewControl",model);}Helper:publicstaticMvcHtmlStringDrawControl(thisHtmlHelperhtmlHelper,stringid,...){varmodel=newFieldControl(){ID=id,...};returnhtmlHelper.Action("DrawControl",model);}publicstaticMvcHtmlStringDrawSimpleControl(thisHtmlHelperhtmlHelper,stringid,...){returnDrawSimpleControl(htmlHelper,id,...);}publicstaticMvcHtmlStringDrawSimpleControl(thisHtmlHelperhtmlHelper,stringid,...){//设置一些默认值以简化API返回DrawControl(htmlHelper,id,...);}publicstaticMvcHtmlStringDrawComplexControl(thisHtmlHelperhtmlHelper,stringid,...)whereT:AbstractComplex,new(){//根据`T`构建需要的控件returnDrawControl(htmlHelper,id,...);}当然还有大约六次其他迭代来帮助解决所示情况之间的这种情况,但没有一个迭代达到必要的程度我确信可以改进,但这是我得到的已经完成的迄今为止。这样做为View提供了一个非常简单的API,不需要知道或关心实现,它只需要很小的修改就可以满足我原始API的所有要求(至少到目前为止)。我不确定这是否是答案的结果,但它是实用的并且提供了必要的简单性。希望我的头痛能帮助将来的人。以上就是C#学习教程:使用HTML帮助程序减少代码重复共享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
