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

C#学习教程:从自定义AdditionalMetadataAttribute访问模型类实例(asp.netmvc5)分享

从自定义AdditionalMetadataAttribute访问模型类实例(asp.netmvc5)我有以下情况–我需要编写一个自定义的附加元数据属性,该属性基于另一

从自定义AdditionalMetadataAttribute访问模型类实例(asp.net mvc 5)

我有以下情况 – 我需要编写一个自定义的附加元数据属性,该属性基于另一个属性值(来自同一模型),向AdditionalValues字典添加一个值。 现在,我的问题是我无法访问属性类中的模型实例。

[AttributeUsage(AttributeTargets.Property)] public class ExtendedAdditionalMetadataAttribute : Attribute, IMetadataAware { #region Private properties private string extraFieldToCheck { get; set; } private string extraFieldValueToCheck { get; set; } private string fieldToBeAdded { get; set; } private string fieldValueToBeAdded { get; set; } #endregion #region Constructor public ExtendedAdditionalMetadataAttribute(string extraFieldToCheck, string extraFieldValueToCheck, string fieldToBeAdded, string fieldValueToBeAdded) { this.extraFieldToCheck = extraFieldToCheck; this.extraFieldValueToCheck = extraFieldValueToCheck; this.fieldToBeAdded = fieldToBeAdded; this.fieldValueToBeAdded = fieldValueToBeAdded; } #endregion public void OnMetadataCreated(ModelMetadata metadata) { // HOW TO GET THE MODEL CLASS INSTANCE??? // metadata.ContainerType is correct by metadata.Container is null. } } 

从代码注释中可以看出,在OnMetadataCreated中我需要访问Model类实例,但是尽管ContainerType是正确的,但Container属性是NULL。

能否通过给我一个关于这个问题的提示来帮助我?

先感谢您!

Evdin

稍后编辑

考虑到我没有给出太多解释,我还将在此处粘贴一个示例,说明我希望如何在模型类上使用此属性:

 ///  /// Gets or sets the IsAccountCreated ///  /// The IsAccountCreated. [UIHint("FormFieldStringTemplate")] [ExtendedAdditionalMetadata("IsExternalAccount", "true", "ReadOnly", "true")] public override Boolean IsAccountCreated { get; set; } ///  /// Gets or sets the IsAccountEnabled ///  /// The IsAccountEnabled. [Display(Name = "Este cont activ?")] [UIHint("FormFieldStringTemplate")] [ExtendedAdditionalMetadata("IsExternalAccount", "true", "ReadOnly", "true")] public override Boolean IsAccountEnabled { get; set; } ///  /// Gets or sets the IsExternalAccount ///  /// The IsExternalAccount. [Display(Name = "Este cont extern?")] [UIHint("FormFieldStringTemplate")] [AdditionalMetadata("ReadOnly", "true")] public override Boolean IsExternalAccount { get; set; } 

稍后和稍后编辑

虽然@ stephen-muecke给出的响应在当前情况下更简单和可接受,但为了编程挑战,我寻找其他选项,我发现了以下可能性:实现自定义DataAnnotationsModelMetadataProvider类。 用几个简单的单词 – 它可以工作,只有当模型类是一个简单的类时我才能获得模型类实例BUT,否则有许多缺点 – 例如,如果你有一个Model类并且你在视图中使用它那么没关系,但是如果你在另一个类(viewmodel中的模型)中有一个类,那么这种方法就不再可用了。

再次感谢@ stephen-muecke!

由于您似乎需要访问模型的多个属性,因此该属性应该以classAttributeTargets.Class )为目标并应用于模型,而不是属性。 这可能意味着您需要添加另一个属性,该属性是您尝试将其应用于的属性的名称。 注意metadata.ContainerType仅为您提供type ,而不是此实例,因此您只能获取其属性的默认值。

编辑

如果需要将属性应用于模型中的多个属性,则无法访问OnMetadataCreated的容器,因为元数据是从最里面的属性创建的,因此尚未创建模型的元数据。

根据OP的评论,更好的解决方案是创建一个自定义的html帮助器。 例如,生成一个只基于另一个属性的值的文本框

 namespace MyHelpers.Html { public static class ReadOnlyHelpers { public static MvcHtmlString ReadOnlyTextBoxIf(this HtmlHelper helper, Expression> expression, bool isReadOnly) { object attributes = isReadOnly ? new { @readOnly= "readonly" } : null; return InputExtensions.TextBoxFor(helper, expression, attributes); } } } 

并在您的视图中使用

 @Html.ReadOnlyTextBoxIf(m => m.SomeTextProperty, Model.SomeBooleanValue) 

创建“只读”复选框有点困难,因为readonly属性对checkbox没有影响。 为了防止用户交互,您需要禁用它,但这意味着值不会回发

 public static MvcHtmlString ReadOnlyCheckBoxIf(this HtmlHelper helper, Expression> expression, bool isReadOnly) { if (isReadOnly) { // If you want to 'visually' render a checkbox (otherwise just render a div with "YES" or "NO") ModelMetadata metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); StringBuilder html = new StringBuilder(); // Add a hidden input for postback html.Append(InputExtensions.HiddenFor(helper, expression).ToString()); // Add a visual checkbox without name so it does not post back TagBuilder checkbox = new TagBuilder("input"); checkbox.MergeAttribute("type", "checkbox"); checkbox.MergeAttribute("disabled", "disabled"); if ((bool)metaData.Model) { checkbox.MergeAttribute("checked", "checked"); } html.Append(checkbox.ToString()); return MvcHtmlString.Create(html.ToString()); } else { // return normal checkbox return InputExtensions.CheckBoxFor(helper, expression); } } 

并在您的视图中使用

上述就是C#学习教程:从自定义AdditionalMetadataAttribute访问模型类实例(asp.net mvc 5)分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记

 @Html.ReadOnlyCheckBoxIf(m => m.IsAccountCreated, Model.IsExternalAccount) 


推荐阅读
  • vue使用
    关键词: ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
  • Asp.net Mvc Framework 七 (Filter及其执行顺序) 的应用示例
    本文介绍了在Asp.net Mvc中应用Filter功能进行登录判断、用户权限控制、输出缓存、防盗链、防蜘蛛、本地化设置等操作的示例,并解释了Filter的执行顺序。通过示例代码,详细说明了如何使用Filter来实现这些功能。 ... [详细]
  • 本文记录了作者对x265开源代码的实现与框架进行学习与探索的过程,包括x265的下载地址与参考资料,以及在Win7 32 bit PC、VS2010平台上的安装与配置步骤。 ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文讨论了如何在不使用SearchBar display controller的情况下,单独使用SearchBar并捕获其textChange事件。作者介绍了实际状况,即左侧SliderMenu中的SearchBar需要在主页TableView中显示搜索结果。然后,作者提供了解决方案和步骤,帮助读者实现这一功能。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
author-avatar
许小懿_336
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有