热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我对这个页面做了什么?

目录介绍背景开发代码辅助功能问题兴趣点介绍按照说明将jQuery自动完成小部件实现到ASP.NET页面并不困难。但是,如果使用partial将多个自动完成

目录

介绍

背景

开发代码

辅助功能问题

兴趣点




介绍

按照说明将jQuery自动完成小部件实现到ASP.NET页面并不困难。但是,如果使用partial将多个自动完成小部件添加到页面中,则需要执行一些额外的工作。当必须使用Web可访问性时也是如此。


背景

它是一个ASP.NET Core MVC Razor视图页面。

最初,Selectize将四个文本输入框转换为选择列表框。其中两个是经理用的,因为项目的数量不多,所以选择框是可以的。另外两个是针对成百上千的员工,而选择框并不是一个好的参与者。


开发代码

以下是作为MVC部分页面的自动完成小部件的第一个版本。

_AutoComplete.cshtml:

@using System.Web
@{Layout = null;
}@* The reason to change the jquery built-in autocomplete styles is that the page is Bootstrapped *@

在主机页面中,可以像这样调用partial:


asp-for="ManagerEmail" placeholder="Start typing an email...">

@await Html.PartialAsync("~/Views/Partials/_AutoCompletion.cshtml", new ViewDataDictionary(ViewData) {{ "TargetId", "ManagerEmail" },{ "TargetHiddenValueElementId", "ManagerContactId" },{ "Source", JsonConvert.SerializeObject(Model.Contacts.Select(x => new { value = x.Id, label = x.Name })) },// Or replace "Source" with // { "AjaxUrl", Url.Action("GetByEmail", "Contact") }, // for ajax call when data is bigger.{ "ValueType", "String" }
})

如果源数据是通过 ViewData被传递给partial的,则partial将使用浏览器本地数据。如果没有,但是使用 AjaxUrl,将触发Ajax调用以从控制器操作或Web服务中提取数据。因此它适用于本地和远程数据。

但是如果z-index值不够大,菜单选项就会出现问题。在我的例子中,其中一个小部件在bootstrap modal 对话框中使用。这是截图:

要解决此问题,我们应该为其z-index设置一个大数字。它应该大于对话框的z-index。稍后会对此进行另一次讨论。这是我们应该通过jQuery UI复制此窗口小部件所需的样式的一个原因。

另一个原因是,由于我们使用其他库,如BootstrapjqGrid,因此可能会覆盖所需的CSS,因此窗口小部件可能没有预期的外观。

如果只有一个自动完成小部件,则此部分工作。如上所述,总共有4个。令我惊讶的是,一旦我应用了所有小部件,当我输入一个小部件时,菜单出现在另一个小部件下方。经过调查,我发现了一个问题。下面是第二个版本,它看起来像一个封装的部分,因此多个实例不会引起冲突。

_AutoComplete.cshtml 版本。2:

@using System.Web
@{Layout = null;
}@{@* The reason to change the jquery built-in autocomplete styles is that the page is Bootstrapped *@var styles = @"
";
}

此版本适用于同一页面上的任意数量的小部件。此外,有两点值得一提:


  1. 窗口小部件所需的样式只添加一次而不重复。
  2. z-index值可以用非常大的数字进行硬编码999999。但是,我喜欢使用所列的计算方法。

辅助功能问题

我使用WAVE插件来评估Web可访问性。令人惊讶的是,有多种表格标签错误,乍一看似乎令人难以置信。

为什么?这是因为使用相同模型呈现的分部(不是自动完成窗口小部件,但是接触部分)的多个实例。例如,要添加和更新经理联系人,两个呈现的部分使用相同的管理器联系模型。员工联系人部分也是如此。

为了解决这个问题,我们需要在页面上绑定/呈现的相同模型之间区分表单标签的属性和字段id值。

直观地,人们可能倾向于编写Javascript代码来更改属性的标签和相应的表单控件ID。它应该可以工作,但我没有尝试这种方法,因为我们可以利用ASP.NET Core MVC强大的标记帮助程序来编写更清晰,更高效的代码。

我就是这样做的。

标记助手:标签标记助手和输入标记助手。

[HtmlTargetElement("label", Attributes = "asp-for")]
public class ResolveMultipleAriaLabelsLabelTagHelper : LabelTagHelper
{public ResolveMultipleAriaLabelsLabelTagHelper(IHtmlGenerator generator) : base(generator){}public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output){var viewData = ViewContext.ViewData;if (viewData["IdPrefixForMultipleAriaLabels"] != null){var forAttribute = output.Attributes.FirstOrDefault(attribute => attribute.Name.ToLower() == "for");if (forAttribute != null){CreateOrMergeAttribute(string.Format("{0}_{1}", viewData["IdPrefixForMultipleAriaLabels"], forAttribute.Value), output);}}var hiddenAriaAttr = output.Attributes.FirstOrDefault(attribute => attribute.Name.ToLower() == "aria-hidden");if (hiddenAriaAttr != null && hiddenAriaAttr.Value.ToString() == "true"){output.TagName = "div";#region keep the look and feel by design as much as possibleoutput.Attributes.Add("class", "label-p");output.Attributes.Add("style", "cursor:pointer");#endregion}return base.ProcessAsync(context, output);}private void CreateOrMergeAttribute(string forName, TagHelperOutput output){if (string.IsNullOrEmpty(forName)) return;var attribute = new TagHelperAttribute("for", forName);output.Attributes.SetAttribute(attribute);}
}

[HtmlTargetElement("input", Attributes = "asp-for")]
public class ResolveMultipleAriaLabelsInputTagHelper : InputTagHelper
{public ResolveMultipleAriaLabelsInputTagHelper(IHtmlGenerator generator) : base(generator){}public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output){var viewData = ViewContext.ViewData;if (viewData["IdPrefixForMultipleAriaLabels"] != null){var nameAttribute = output.Attributes.FirstOrDefault(attribute => attribute.Name.ToLower() == "name");CreateOrMergeAttribute(string.Format("{0}_{1}", viewData["IdPrefixForMultipleAriaLabels"], nameAttribute.Value), output);}return base.ProcessAsync(context, output);}private void CreateOrMergeAttribute(string id, TagHelperOutput output){if (string.IsNullOrEmpty(id)) return;var attribute = new TagHelperAttribute("Id", id);output.Attributes.SetAttribute(attribute);}
}

背后的想法是在必要时更改标签的属性和输入ID,以便它们可以一对一匹配。

如果我们希望它以可分辨的label-forinput-id呈现,请按以下方式调用分部:

@await Html.PartialAsync("~/Views/Partials/_AddContact.cshtml", new Contact { CanAssociateAccount = false }, new ViewDataDictionary(ViewData) { { "IdPrefixForMultipleAriaLabels", "Manager" } })

IdPrefixForMultipleAriaLabels 变量由ViewContext中携带的ViewData传递到标记助手中。然后可以将Contact字段呈现为以下内容:



然后,标签的for属性仅与前缀为“ Manager_” 的输入id匹配。应用此功能后,WAVE将永远不会抱怨Contact部分中单个输入的多个标签。虽然辅助工具可能没有多个标签的问题,但项目所有者会对修复感到满意。


兴趣点


  1. 使用Javascript函数在一个页面上隔离相同的部分
  2. jQuery自动完成小部件,用于使用本地或远程数据,具体取决于数据大小
  3. 使用ASP.NET Core MVC标记帮助程序来解决可访问性问题
  4. 用户数据从视图页面传递到标记助手以执行有条件的工作

 

原文地址:https://www.codeproject.com/Articles/1368309/What-Did-I-Do-with-this-Page


推荐阅读
  • 精通jQuery:深入解析事件处理机制与应用技巧
    本文详细探讨了jQuery的事件处理机制及其应用技巧,通过具体的代码示例,逐一解析了每个jQuery代码片段与其对应的HTML结构。文章以标记为基准,CSS作为通用样式,确保每段代码都能独立运行。HTML和CSS代码统一放置在文章末尾,方便读者参考和实践。 ... [详细]
  • C#中实现高效UDP数据传输技术
    C#中实现高效UDP数据传输技术 ... [详细]
  • 在List和Set集合中存储Object类型的数据元素 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • Java中处理NullPointerException:getStackTrace()方法详解与实例代码 ... [详细]
  • 期末Web开发综合实践项目:运用前端技术打造趣味小游戏体验
    期末Web开发综合实践项目中,学生通过运用HTML、CSS和JavaScript等前端技术,设计并实现了一款趣味性十足的小游戏。该项目不仅检验了学生对前端基础知识的掌握情况,还提升了他们的实际操作能力和创意设计水平。视频链接展示了项目的最终成果,直观呈现了游戏的互动性和视觉效果。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 在 Windows 10 环境中,通过配置 Visual Studio Code (VSCode) 实现基于 Windows Subsystem for Linux (WSL) 的 C++ 开发,并启用智能代码提示功能。具体步骤包括安装 VSCode 及其相关插件,如 CCIntelliSense、TabNine 和 BracketPairColorizer,确保在 WSL 中顺利进行开发工作。此外,还详细介绍了如何在 Windows 10 中启用和配置 WSL,以实现无缝的跨平台开发体验。 ... [详细]
  • 深入解析 Android 选择器与形状绘制技术
    本文深入探讨了 Android 中选择器(Selector)与形状绘制(Shape Drawing)技术的应用与实现。重点分析了 `Selector` 的 `item` 元素,其中包括 `android:drawable` 属性的使用方法及其在不同状态下的表现。此外,还详细介绍了如何通过 XML 定义复杂的形状和渐变效果,以提升 UI 设计的灵活性和美观性。 ... [详细]
  • 在Ubuntu系统中,由于预装了MySQL,因此无需额外安装。通过命令行登录MySQL时,可使用 `mysql -u root -p` 命令,并按提示输入密码。常见问题包括:1. 错误 1045 (28000):访问被拒绝,这通常是由于用户名或密码错误导致。为确保顺利连接,建议检查MySQL服务是否已启动,并确认用户名和密码的正确性。此外,还可以通过配置文件调整权限设置,以增强安全性。 ... [详细]
  • 深入解析 Android Drawable:第六阶段进阶指南 ... [详细]
author-avatar
周茜闹心_325
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有