从自定义的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。

您能帮我提示一下这个问题吗?

先感谢您!

你家

后期编辑

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

/// <summary>
/// Gets or sets the IsAccountCreated
/// </summary>
/// <value>The IsAccountCreated.</value>
[UIHint("FormFieldStringTemplate")]
[ExtendedAdditionalMetadata("IsExternalAccount", "true", "ReadOnly", "true")]
public override Boolean IsAccountCreated { get; set; }      

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

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

以后再编辑

尽管@ stephen-muecke给出的响应在当前情况下更为简单并且可以接受,但是出于编程挑战的考虑,我一直在寻找其他选择,并且发现了以下可能性:实现自定义DataAnnotationsModelMetadataProvider类。简单来说-它可以工作,并且只有在模型类是简单类的情况下,我才能获得模型类实例,但是有很多缺点-例如,如果您有一个Model类并且在视图中使用它那就可以了,但是如果您在另一个类(视图模型中的模型)中有一个类,则此方法不再可用。

再次感谢您@ stephen-muecke!

用户名

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

编辑

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

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

namespace MyHelpers.Html
{
  public static class ReadOnlyHelpers
  {
    public static MvcHtmlString ReadOnlyTextBoxIf<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> 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<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, bool>> 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);
  }
}

并在您看来用作

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ASP.NET MVC 5自定义错误页面

来自分类Dev

如何在 asp .net MVC 5 中将对象结果模型转换为自定义视图模型

来自分类Dev

ASP.NET MVC-在自定义HTML帮助器中使用模型

来自分类Dev

未经授权的Asp.net MVC访问自定义错误页面

来自分类Dev

在ASP.NET MVC 4中向单选按钮添加自定义类

来自分类Dev

将自定义类添加到ASP.NET MVC 4中的单选按钮

来自分类Dev

在Asp.Net MVC中验证自定义用户类

来自分类Dev

如何在ASP.NET MVC5中创建自定义支架模板?

来自分类Dev

如何在ASP.Net MVC 5视图中获取ApplicationUser的自定义属性值?

来自分类Dev

ASP.NET MVC5以自定义格式显示日期

来自分类Dev

ASP.NET 5 MVC6自定义CSS和Javascript放置约定

来自分类Dev

如何为新的Microsoft.Asp.NET身份(MVC5)设置自定义架构

来自分类Dev

创建自定义路由层次结构ASP.NET MVC 5

来自分类Dev

Asp.net 5 MVC 6自定义身份验证

来自分类Dev

ASP.NET MVC 5基于用户角色自定义Bootstrap导航栏

来自分类Dev

ASP.NET MVC 5中的自定义oAuth客户端

来自分类Dev

ASP.NET MVC 5:基于本地化路由参数的自定义登录URL

来自分类Dev

使用自定义表扩展ASP.NET MVC 5身份

来自分类Dev

自定义MVC5 ASP.NET Identity中的cookie值

来自分类Dev

映射自定义路由ASP.NET MVC5

来自分类Dev

使用ASP.NET Identity 2.0和MVC 5的自定义单点登录

来自分类Dev

ASP.NET MVC 5中的自定义文件夹结构

来自分类Dev

在_Layout.cshtml ASP.NET MVC 5中启用自定义脚本

来自分类Dev

如何在ASP.NET MVC 5中注册自定义主体类型?

来自分类Dev

自定义MVC5 ASP.NET Identity中的cookie值

来自分类Dev

创建自定义路由层次结构ASP.NET MVC 5

来自分类Dev

Asp.net 5 MVC 6自定义身份验证

来自分类Dev

一个区域下的Asp.Net MVC 5自定义动作路由

来自分类Dev

在MVC 5中的ASP.NET Identity 3上管理自定义用户属性

Related 相关文章

  1. 1

    ASP.NET MVC 5自定义错误页面

  2. 2

    如何在 asp .net MVC 5 中将对象结果模型转换为自定义视图模型

  3. 3

    ASP.NET MVC-在自定义HTML帮助器中使用模型

  4. 4

    未经授权的Asp.net MVC访问自定义错误页面

  5. 5

    在ASP.NET MVC 4中向单选按钮添加自定义类

  6. 6

    将自定义类添加到ASP.NET MVC 4中的单选按钮

  7. 7

    在Asp.Net MVC中验证自定义用户类

  8. 8

    如何在ASP.NET MVC5中创建自定义支架模板?

  9. 9

    如何在ASP.Net MVC 5视图中获取ApplicationUser的自定义属性值?

  10. 10

    ASP.NET MVC5以自定义格式显示日期

  11. 11

    ASP.NET 5 MVC6自定义CSS和Javascript放置约定

  12. 12

    如何为新的Microsoft.Asp.NET身份(MVC5)设置自定义架构

  13. 13

    创建自定义路由层次结构ASP.NET MVC 5

  14. 14

    Asp.net 5 MVC 6自定义身份验证

  15. 15

    ASP.NET MVC 5基于用户角色自定义Bootstrap导航栏

  16. 16

    ASP.NET MVC 5中的自定义oAuth客户端

  17. 17

    ASP.NET MVC 5:基于本地化路由参数的自定义登录URL

  18. 18

    使用自定义表扩展ASP.NET MVC 5身份

  19. 19

    自定义MVC5 ASP.NET Identity中的cookie值

  20. 20

    映射自定义路由ASP.NET MVC5

  21. 21

    使用ASP.NET Identity 2.0和MVC 5的自定义单点登录

  22. 22

    ASP.NET MVC 5中的自定义文件夹结构

  23. 23

    在_Layout.cshtml ASP.NET MVC 5中启用自定义脚本

  24. 24

    如何在ASP.NET MVC 5中注册自定义主体类型?

  25. 25

    自定义MVC5 ASP.NET Identity中的cookie值

  26. 26

    创建自定义路由层次结构ASP.NET MVC 5

  27. 27

    Asp.net 5 MVC 6自定义身份验证

  28. 28

    一个区域下的Asp.Net MVC 5自定义动作路由

  29. 29

    在MVC 5中的ASP.NET Identity 3上管理自定义用户属性

热门标签

归档