在实体框架中设置 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?