是否可以将条件属性创建为 DisplayIf?

2024-02-25

我想创建一个与我的视图模型一起使用的属性。我想根据第三个值显示不同的文本字符串。

我想做这样的事情......

[DisplayIf("IsPropertyValid", true, Name="value 1")]
[DisplayIf("IsPropertyValid", false, Name="value 2")]
public string MyProperty { get; set; }

public bool IsPropertyValid { get; set; }

根据我的值 IsPropertyValid 是否为真,我想显示其中之一。 IE。当属性 IspPropertyValid 等于 true 时,“值 1”将是显示文本,否则它将是“值 2”。

这可以通过 ASP NET.MVC 属性实现吗?或者甚至更好......像这样的组合......

[DisplayIf("IsPropertyValid", new {"value 1", "value 2"})].
public string MyProperty { get; set; }

public bool IsPropertyValid { get; set; }

然后该属性检查 IsPropertyValid 的值并确保显示的值是“值 1”或“值 2”。


以下是如何进行此操作的示例。

我们要做的是创建一个简单的类,名为Person并显示有关它们的一些基本信息。

一个人有两个属性

  • Name
  • IsActive

The IsActiveproperty 是一个 bool 值,将用于确定用户名的显示形式。

最终我们要做的是应用一个名为DisplayIf到名称属性。它看起来像这样:

[DisplayIf("IsActive", "This value is true.", "This value is false.")]

首先,让我们创建我们的模型。创建一个名为Person并将其放入Models folder.

模型/人物.cs

public class Person
{
    [DisplayIf("IsActive", "This value is true.", "This value is false.")]
    public string Name { get; set; }
    public bool IsActive { get; set; }
}

创建一个名为的文件夹属性然后将以下类放入其中:

属性/DisplayIfAttribute.cs

public class DisplayIfAttribute : Attribute
{
    private string _propertyName;
    private string _trueValue;
    private string _falseValue;

    public string PropertyName
    {
        get { return _propertyName; }
    }

    public string TrueValue
    {
        get { return _trueValue; }
    }

    public string FalseValue
    {
        get { return _falseValue; }
    }

    public DisplayIfAttribute(string propertyName, string trueValue, string falseValue)
    {
        _propertyName = propertyName;
        _trueValue = trueValue;
        _falseValue = falseValue;
    }
}

让我们创建一个简单的控制器和操作。我们将使用通用的/首页/索引.

控制器/HomeController.cs

public class HomeController : Controller
{
    public ActionResult Index()
    {
        HomeIndexViewModel viewModel = new HomeIndexViewModel();

        Person male = new Person() { Name = "Bob Smith", IsActive = true };
        Person female = new Person() { Name = "Generic Jane", IsActive = false };

        Person[] persons = {male, female};

        viewModel.Persons = persons;

        return View(viewModel);
    }

}

创建一个名为的新文件夹视图模型并创建一个HomeViewModels.cs class.

ViewModels/HomeViewModels.cs

public class HomeIndexViewModel
{
    public IEnumerable<Person> Persons { get; set; }
}

Our Index视图很简单。

视图/Home/Index.cshtml

@model HomeIndexViewModel

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<div>
    @Html.DisplayForModel()
</div>

DisplayForModel当您创建此显示模板时将起作用:

视图/Home/DisplayTemplates/HomeIndexViewModel.cshtml

@model HomeIndexViewModel

@Html.DisplayFor(m => m.Persons)

DisplayFor-> 当您创建此显示模板时,人员将起作用:

视图/共享/DisplayTemplates/Person.cshtml

@model Person

@foreach (var prop in ViewData.ModelMetadata.Properties)
{
    if (prop.HasDisplayIfAttribute())
    { 
        <p>@Html.DisplayIfFor(x => prop)</p>
    }
    else
    { 
        <p>@Html.DisplayFor(x => prop.Model)</p>
    }
}

但是这个显示模板中的这些方法是什么?创建一个名为的新文件夹扩展并添加以下类:

扩展/ModelMetaDataExtensions.cs

public static class ModelMetaDataExtensions
{
    public static bool HasDisplayIfAttribute(this ModelMetadata data)
    {
        var containerType = data.ContainerType;
        var containerProperties = containerType.GetProperties();
        var thisProperty = containerProperties.SingleOrDefault(x => x.Name == data.PropertyName);
        var propertyAttributes = thisProperty.GetCustomAttributes(false);
        var displayIfAttribute = propertyAttributes.FirstOrDefault(x => x is DisplayIfAttribute);

        return displayIfAttribute != null;
    }
}

扩展/HtmlHelper Extensions.cs

public static class HtmlHelperExtensions
{
    public static IHtmlString DisplayIfFor<TModel, TProperty>
        (this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
        where TProperty : ModelMetadata
    {
        string returnValue = string.Empty;

        var modelMetaData = expression.Compile().Invoke(helper.ViewData.Model);

        var containerType = typeof(TModel);
        var containerProperties = containerType.GetProperties();
        var propertyInfo = containerProperties
            .SingleOrDefault(x => x.Name == modelMetaData.PropertyName);
        var attribute = propertyInfo.GetCustomAttributes(false)
            .SingleOrDefault(x => x is DisplayIfAttribute) as DisplayIfAttribute;
        var conditionalTarget = attribute.PropertyName;

        var conditionalTargetValue = (bool)containerType
            .GetProperty(conditionalTarget).GetValue(helper.ViewData.Model);

        if (conditionalTargetValue)
        {
            returnValue = attribute.TrueValue;
        }
        else
        {
            returnValue = attribute.FalseValue;
        }

        return MvcHtmlString.Create(returnValue);
    }
}

最终输出:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以将条件属性创建为 DisplayIf? 的相关文章

随机推荐

  • 与 iOS 6.0 原生 Facebook 集成共享:“通过我的应用程序名称发布”?

    我刚刚通过 ios 6 将 facebook 集成到我的应用程序中 但在墙上发帖时遇到问题 它只是说 通过 ios 应用程序发布 我想让它说 通过应用程序名称发布 我已经使用 Facebook 创建了应用程序身份 并且拥有他们分配的应用程序
  • 如何在 matplotlib / Python 中直接将散点图叠加在 jpg 图像上?

    我需要快速绘制作为跟踪算法输出的 jpg 帧 与 jpg 帧一起的是包含简单 x y 数据的文本文件 用于定位正在跟踪的图像目标 我想使用 matplotlib 绘制 jpg 图像 然后覆盖 x y 数据的散点图 该数据从文本文件中读取并存
  • Tensorflow 0.8导入导出输出张量问题

    我正在使用 Tensorflow 0 8 和 Python 3 我正在尝试训练神经网络 目标是每 50 次迭代自动导出 导入网络状态 问题是当我在第一次迭代时导出输出张量时 输出张量名称是 Neg 0 Slice 0 但是当我在第二次迭代时
  • WSO2 ESB 4.8 中的 RabbitMQ AMQP 传输支持

    http docs wso2 org display ESB480 RabbitMQ AMQP Transport http docs wso2 org display ESB480 RabbitMQ AMQP Transport我已经完成
  • 如何在 R 中执行*快速* DCT(离散余弦变换)?

    使用 Rprof 发现 dtt 包中的 dct 是一段运行速度相当缓慢的 R 代码中的主要罪魁祸首 将其替换为 stats 包中的 fft 这不是相同的转换 但应该花费相同的时间来计算 我的运行时间显着提高 事实上 我的 Rprof 线路中
  • 拉力赛Python API

    我正在尝试按照以下网址的说明使用 Python 工具包获取我公司的 Rally 订阅http developer rallydev com help python toolkit rally rest api http developer
  • 使用 Java 连接到在 Docker 内运行的 MongoDB 副本集 (Windows)

    我想使用 docker 设置 MongoDB 副本集 设置似乎没问题 但我无法使用 Java 应用程序连接到集群 我在 Windows 10 上运行 Docker 版本 17 06 0 ce 并使用 VirtualBox 作为驱动程序 我按
  • 在 Google 地图上处理 ctrl+click

    我试图让用户通过按控制键并单击标记来选择地图上的多个标记 为此 我编写了以下代码 google maps event addListener marker click function e detect if is pressed ctrl
  • Java:摆脱 `Cipher.init()` 开销

    我需要提高以下方法的性能 private byte decrypt final byte encrypted final Key key throws this cipher init Cipher DECRYPT MODE key ret
  • NetworkX 打乱节点顺序

    我是编程初学者 也是新来的 所以你好 我在 networkX 中遇到节点顺序问题 这段代码 letters G nx Graph for i in range nodesNum letter ascii lowercase i letter
  • 将 Hg 与 Grails 结合使用的最佳实践?

    我应该办理什么手续 不办理什么手续 由于许多文件有时是自动生成的 我不完全确定如何使用版本控制来处理这个问题 它与标签有关吗 例如在 ANT 中 我know不要签入我的 target bin 目录 但是 Grails 对此又增加了一层混乱
  • 如何使用 jQuery 设置跨度值

    如何设置a的值 span 使用 jQuery 标记 例如 下面是我的 span tag span span 在我的 jQuery 代码中 jQuery noConflict jQuery document ready function va
  • 使用 MEF 2 组合导出值

    使用 MEF 1 可以使用 ComposeExportedValue Method 将现有对象组合到容器中 container ComposeExportedValue 如何使用 Microsoft Composition MEF 2 来完
  • 如何在不使用触摸屏的情况下模拟触摸事件

    我目前正在尝试开发一个触摸屏应用程序 Windows 7的 视觉工作室2013 C WPF 我工作的地方将配备触摸屏 实际上是放置在平面屏幕上的一层 我希望能够生成触摸输入 以便在没有屏幕的情况下开发和测试应用程序 我找到的所有资源要么非常
  • 定制 Android 操作系统构建

    我想知道创建自定义 Android 版本并将其部署到市场上当前可用的设备上的可行性如何 是否有描述该过程的文件或指南 先感谢您 萨米 Try dsixda 的 Android 厨房 http forum xda developers com
  • JSON序列化时如何使用JavaScriptSerializer设置格式?

    我正在使用 JavaScriptSerializer 将文件中的对象序列化为 JSON 格式 但结果文件没有可读的格式 如何允许格式化以获得可读文件 你可以使用JSON NET http json codeplex com 序列化器 支持
  • Matplotlib寄生对数轴勾选不需要的镜像

    我正在尝试使用 mpl toolkits axes grid1 中的 host subplot 制作一个具有两个 y 轴的图 其中一个是对数轴 一个是线性轴 该图看起来不错 但辅助 y 轴 右 的小刻度也显示在图内部的主 y 轴 左 上 i
  • android sqlite数据库中rawquery和execSQL的区别

    使用 rawquery 和 execSQL 之间的确切区别是什么 在 android Activity 中编写查询时 何时使用 rawquery 以及何时使用 execSQL 来自 API 文档 void execSQL String sq
  • 片段 - 您是否必须在包含整个活动的片段周围使用活动包装器?

    考虑以下示例应用程序开发者 android com http developer android com images fundamentals fragments png 这描述了如何使用 Fragment 如下所示 在电话上 您可以在活
  • 是否可以将条件属性创建为 DisplayIf?

    我想创建一个与我的视图模型一起使用的属性 我想根据第三个值显示不同的文本字符串 我想做这样的事情 DisplayIf IsPropertyValid true Name value 1 DisplayIf IsPropertyValid f