ASP.NET MVC验证属性:验证中未使用更新的属性

ASP.NET MVC验证属性:验证中未使用更新的属性,asp.net,asp.net-mvc,validation,Asp.net,Asp.net Mvc,Validation,在使用validation属性验证输入数据之前,我需要能够更改输入数据。例如,在瑞典,邮政编码可以包含空格,如“11122”。我想在验证之前删除空间。我尝试了下面的解决方案,但没有成功 我有一个具有验证属性StringLength(5)的属性。提交表单后,我在绑定到视图模型类时更新属性值。我的问题是,当验证发生时,它使用在我更改它之前发布的值,尽管我知道DefaultModelBinder在set方法之后运行。在下面的代码示例中,我认为输入值“11122”和“11122”都可以工作,因为在我的s

在使用validation属性验证输入数据之前,我需要能够更改输入数据。例如,在瑞典,邮政编码可以包含空格,如“11122”。我想在验证之前删除空间。我尝试了下面的解决方案,但没有成功

我有一个具有验证属性StringLength(5)的属性。提交表单后,我在绑定到视图模型类时更新属性值。我的问题是,当验证发生时,它使用在我更改它之前发布的值,尽管我知道DefaultModelBinder在set方法之后运行。在下面的代码示例中,我认为输入值“11122”和“11122”都可以工作,因为在我的set方法中,我从字符串中删除了空格,但“11122”并没有按预期进行验证

示例Index.cshtml文件

@using (Html.BeginForm("Index", "Form", FormMethod.Post))
{
    Enter post code
    @Html.TextBoxFor(x => x.PostCode)
    @Html.ValidationMessageFor(x => x.PostCode)
    <input type="submit" value="Save"/>
}
控制器中的示例动作方法

public ActionResult Index(Client client)
{
    return View(client);
}
我知道属性中的set方法是在验证之前调用的,因为我尝试重写DefaultModelBinder,然后向其添加了断点。我还创建了一个自定义验证属性,该属性继承自StringLength,用于检查验证的值。有什么建议吗


一个额外的问题,我也想知道为什么验证后返回的值会将旧值绑定到输入控件,但如果我只是将模型属性写入视图(@model.Name),我就得到了更新的值。

它使用旧值是什么意思?您如何期望6个字符的
“111 22”
通过只允许5个字符的验证?自定义ModelBinder和StringLengthattAttribute的代码是什么?我更新了这个问题,希望现在更清楚。对于旧值,我指的是更改(设置)前的值。因为我更新了值并删除了空间,所以我认为它会被验证。我重写了它们并添加了断点,只是为了查看它们的调用顺序和使用的值。
DefaultModelBinder
set
方法之后没有运行。
DefaultModelBinder
负责设置该值。验证是基于发布的值(从
ValueProvider
读取),而不是基于setter中的代码。您说过您有一个
自定义验证属性,但您没有显示该属性,因此我们无法猜测代码的作用。我创建自定义验证只是为了查看真正验证的值。我没有用它。只有示例中的代码。好的,是否可以从ValueProvider设置值,或者这样做是不好的做法?糟糕的做法。编写您自己的验证属性,或者只检查控制器中的值并添加
modelstatererror
并返回视图。它使用旧值是什么意思?您如何期望6个字符的
“111 22”
通过只允许5个字符的验证?自定义ModelBinder和StringLengthattAttribute的代码是什么?我更新了这个问题,希望现在更清楚。对于旧值,我指的是更改(设置)前的值。因为我更新了值并删除了空间,所以我认为它会被验证。我重写了它们并添加了断点,只是为了查看它们的调用顺序和使用的值。
DefaultModelBinder
set
方法之后没有运行。
DefaultModelBinder
负责设置该值。验证是基于发布的值(从
ValueProvider
读取),而不是基于setter中的代码。您说过您有一个
自定义验证属性,但您没有显示该属性,因此我们无法猜测代码的作用。我创建自定义验证只是为了查看真正验证的值。我没有用它。只有示例中的代码。好的,是否可以从ValueProvider设置值,或者这样做是不好的做法?糟糕的做法。编写您自己的验证属性,或者只需检查控制器中的值并添加
modelstatererror
并返回视图。
public ActionResult Index(Client client)
{
    return View(client);
}