在实体框架中设置 HTML <input> step 属性

Posted

技术标签:

【中文标题】在实体框架中设置 HTML <input> step 属性【英文标题】:Set the HTML <input> step Attribute in Entity Framework 【发布时间】:2022-01-01 09:12:29 【问题描述】:

有没有办法使用注解来定义“step”属性? 目前我只能通过直接在视图中设置它来设置它

<input asp-for="Quantity" class="form-control" ste="1" />

我的模型目前只定义了一个范围,它不适用于 min/max html 属性:

[Range(0, 9999999)]
public int Quantity  get; set; 

【问题讨论】:

您是否尝试过创建自定义 HTML 帮助程序? 【参考方案1】:

借助评论的提示,我能够找到并弄清楚这一点。

这些是代码中的 sn-ps。 首先是 Step 的一个属性

    public class StepAttribute : ValidationAttribute
    
        public StepAttribute(double increment)
        
            Increment = increment;
        

        public StepAttribute(int increment)
        
            Increment = increment;
        

        public double Increment  get; private set; 

        public override bool IsValid(object value)
        
            if (int.TryParse(value.ToString(), out int i))
                return i > 0;
            else if (double.TryParse(value.ToString(), out double d))
                return d > 0;
            return false;
        
    

然后是标签助手

    [HtmlTargetElement("input", Attributes = "asp-for")]
    public class InputStepTagHelper : TagHelper
    
        public override int Order  get;  = int.MaxValue;

        [HtmlAttributeName("asp-for")]
        public ModelExpression For  get; set; 

        public override void Process(TagHelperContext context, TagHelperOutput output)
        
            base.Process(context, output);

            if (context.AllAttributes["step"] == null)
            
                var increment = GetStepIncrement(For.ModelExplorer.Metadata.ValidatorMetadata);
                if (increment > 0)
                    output.Attributes.Add("step", increment);
            
        

        private static double GetStepIncrement(IReadOnlyList<object> validatorMetadata)
        
            if (validatorMetadata.Count == 0)
                return 0;

            for (var i = 0; i < validatorMetadata.Count; i++)
                if (validatorMetadata[i] is StepAttribute myAttribute && myAttribute.Increment > 0)
                    return myAttribute.Increment;
            return 0;
        
    

我必须将 @addTagHelper *, ProjectName 添加到我的 _ViewImports

使用相同的逻辑,我为 Range 添加了一个作为标记助手的 Min/Max

    [HtmlTargetElement("input", Attributes = "asp-for")]
    public class InputMinMaxTagHelper : TagHelper
    
        public override int Order  get;  = int.MaxValue;

        [HtmlAttributeName("asp-for")]
        public ModelExpression For  get; set; 

        public override void Process(TagHelperContext context, TagHelperOutput output)
        
            base.Process(context, output);

            if (context.AllAttributes["min"] == null)
            
                // Attempt to check for a MaxLength annotation
                var min = GetMinvalue(For.ModelExplorer.Metadata.ValidatorMetadata);
                if (min.HasValue)
                    output.Attributes.Add("min", min.Value);
            

            if (context.AllAttributes["min"] == null)
            
                var max = GetMaxvalue(For.ModelExplorer.Metadata.ValidatorMetadata);
                if (max.HasValue)
                    output.Attributes.Add("max", max.Value);
            
        

        private static double? GetMinvalue(IReadOnlyList<object> validatorMetadata)
        
            if (validatorMetadata.Count == 0)
                return null;

            for (var i = 0; i < validatorMetadata.Count; i++)
                if (validatorMetadata[i] is RangeAttribute myAttribute && double.TryParse(myAttribute.Minimum.ToString(), out double d))
                    return d;

            return null;
        
        private static double? GetMaxvalue(IReadOnlyList<object> validatorMetadata)
        
            if (validatorMetadata.Count == 0)
                return null;

            for (var i = 0; i < validatorMetadata.Count; i++)
                if (validatorMetadata[i] is RangeAttribute myAttribute && double.TryParse(myAttribute.Maximum.ToString(), out double d))
                    return d;

            return null;
        

【讨论】:

【参考方案2】:

使用 HtmlHelpers 看看。辅助方法可以轻松绑定到视图数据或模型数据,尤其是使用您正在使用的注释

【讨论】:

我希望留在 asp-for 中,以便在使用强类型视图构建视图时更容易(并允许它最初使用模型类)。希望这可以避免必须确保将 step="1" (或另一个数字)添加到可能具有此输入的所有视图中。另外,如果该步骤需要更改,我必须更新所有视图。 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于在实体框架中设置 HTML <input> step 属性的主要内容,如果未能解决你的问题,请参考以下文章

在实体框架中设置数据库超时

如何在实体框架中设置默认值

如何在连接字符串中设置实体框架 4 CommandTimeout?

如何首先在实体框架代码中设置身份主键的起始值?

如何在实体框架中设置 SQL Server 2008 的登录信息?

如何在 HTML 日期输入标签中设置日期格式?