为了账号安全,请及时绑定邮箱和手机立即绑定

自定义验证属性的 ValidationContext 缺少字段

自定义验证属性的 ValidationContext 缺少字段

C#
青春有我 2023-08-13 16:07:20
我正在使用 MVC 5。我正在编写一个表单,供用户向内部应用程序提交索赔,并且在创建索赔时,我需要根据用户的当前余额验证用户的索赔金额。如果金额大于余额(例如 10 美元对 5 美元),它会拒绝,并要求他们将余额清零。我认为最好将余额作为CurrentBalance视图模型上的(不可编辑的)属性,并使用自定义验证属性来比较两个值。我将其呈现为表单上的只读字段。当用户选择要提交到哪个程序(例如 HRA)时,ajax 请求会根据他们选择的程序填写当前余额。问题在于,当视图模型实例作为我的属性的一部分传递时ValidationContext,它CurrentBalance 始终显示为零。所以无论余额是多少,验证无一例外都会失败。我尝试CurrentBalance在视图上创建一个普通的非只读字段,并在提交之前自行设置值。我还尝试在渲染视图之前在控制器中设置值。无论哪种情况,它仍然为零,如上图所示。我的自定义属性如下:public class ClaimAmountAttribute : ValidationAttribute{    protected override ValidationResult IsValid(object value, ValidationContext validationContext)    {        var claim = (ClaimCreateViewModel)validationContext.ObjectInstance;        var amount = (decimal)value;        if (claim.CurrentBalance - amount < 0)        {            return new ValidationResult(GetErrorMessage());        }        return ValidationResult.Success;    }    public string GetErrorMessage() => "Amount must be less than balance; please zero out balance instead.";}以下是我观点的相关部分 - 不过,只读属性是否存在似乎并没有什么区别:@model ClaimCreateViewModel<div class="form-group">    @Html.LabelFor(model => model.CurrentBalance, htmlAttributes: new { @class = "control-label col-md-2" })    <div class="col-md-10">        @Html.EditorFor(model => model.CurrentBalance, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })    </div></div><div class="form-group">    @Html.LabelFor(model => model.Amount, htmlAttributes: new { @class = "control-label col-md-2" })    <div class="col-md-10">        @Html.EditorFor(model => model.Amount, new { htmlAttributes = new { @class = "form-control" } })        @Html.ValidationMessageFor(model => model.Amount, "", new { @class = "text-danger" })    </div></div>似乎我所做的一切都没有产生 的CurrentBalance价值ValidationContext。请帮帮我。
查看完整描述

1 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

事实证明,我的 POST 操作的属性[Bind]丢失了CurrentBalance。验证发生在操作之前,但这并不重要;[Bind]在此之前采取行动,以防止过度发布。我已经更新了该操作,现在可以使用了:


public ActionResult Create([Bind(Include = "TransactionID,Amount,CurrentBalance")] ClaimCreateViewModel claim)

    // ...

}


查看完整回答
反对 回复 2023-08-13
  • 1 回答
  • 0 关注
  • 95 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信