c# - 在显示属性中使用 appsettings 键
问题描述
我有一些硬编码的值,我想更改它以从 web.config 读取值。
[Display(Name = "SomeValue")]
我试过了
[Display(Name = ConfigurationManager.AppSettings["SomeValue"].ToString())]
属性参数必须是常量表达式,...
解决方案
要正确执行此操作,您将创建一个新属性来代替DisplayAttribute
,以及一个ModelMetadataProvider
正确读取该属性和其他显示属性的新属性。
简单来说,您创建一个HtmlHelper
读取属性的新扩展,然后访问 Web.config 以找到该 AppSettings 键并返回值。
模型
public class SomeClass
{
[Display(Name ="IdColText")]
public int Id { get; set; }
}
扩大
using System;
using System.Configuration;
using System.Linq.Expressions;
using System.Web.Mvc;
namespace ProjectName
{
public static class DisplayConfigNameExtension
{
public static MvcHtmlString DisplayConfigNameFor<TModel, TResult>(this HtmlHelper<TModel> html, Expression<Func<TModel, TResult>> expression)
{
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, new ViewDataDictionary<TModel>());
string configName = metadata.DisplayName;
return MvcHtmlString.Create(ConfigurationManager.AppSettings[configName]);
}
}
}
看法
@model SomeClass
// The following is required for the HtmlHelper extension
@using ProjectName;
@Html.DisplayConfigNameFor(m => m.Id)
如果使用DisplayNameAttribute
而不是,这也将起作用DisplayAttribute
,并且也应该适用于带有 的类MetadataTypeAttribute
。
推荐阅读
- php - 使用缓存使用 XMLReader PHP 解析 xml 文件
- javascript - 如何在 PageLoad 上获取 HiddenField 值(后面的代码)
- asp.net-mvc - ASP.NET CORE MVC / 如何在同一个控制器上分配 2 个身份角色
- c++ - 从 '(signed) -1' 到 'unsigned long' 的转换是否标准化?
- angular - Ionic 3 radio-group 未绑定所选项目
- sql - 查找组中存在两个条件的位置
- git - 无法从 heroku 克隆项目 - (在其他计算机上)
- sql - SQL 检查值是否存在于分区中使用 CASE WHEN 没有任何 JOIN
- delphi - 使用 Indy 和 Delphi 10 连接 SSL 时出错
- firebase - 模糊的 Unity Firebase 实时数据库错误:“不支持自定义运行循环”?