有沒有辦法使用注釋來定義“步驟”屬性?目前我只能通過在視圖中直接設定來設定它
<input asp-for="Quantity" class="form-control" ste="1" />
我的模型當前只定義了一個范圍,它不適用于 min/max html 屬性:
[Range(0, 9999999)]
public int Quantity { get; set; }
uj5u.com熱心網友回復:
根據評論的提示,我能夠找到并解決這個問題。
這些是代碼的片段。首先是 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 添加了一個作為標簽助手的最小值/最大值
[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;
}
uj5u.com熱心網友回復:
使用 HtmlHelpers 并查看。輔助方法可以輕松系結查看資料或模型資料,尤其是您正在使用的注釋
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/365012.html
