0

我有一个扩展方法,我从我的 EditorTemplate(对于一个字符串)中调用它,它在控件上设置标签和所需的元数据。(我无法注释我的模型,所以这就是我这样做的原因)。

 public static void SetMetadata(this ViewUserControl control)
    {
        if (!string.IsNullOrEmpty((string)control.ViewData["labeltext"]))
            control.ViewData.ModelMetadata.DisplayName = (string)control.ViewData["labeltext"];

        if (control.ViewData["required"] != null)
            control.ViewData.ModelMetadata.IsRequired = (bool)control.ViewData["required"];
    }

有没有人知道为什么 ModelState.IsValid 不会在我设置为Required = true的字段上找到?

4

2 回答 2

3

这里的问题是您正在修改ModelMetadataget对页面的请求。当您执行操作时,此信息不会保留post(因为 MVC 中没有ViewStateesque 机制)。

您尝试验证的课程是否标记为partial?如果是这样,您可以使用 coolMetadataType属性来装饰带有验证属性的类:

[MetadataType(typeof(JobOpening_Validation))]
public partial class JobOpening
{
     //JobOpening is generated by LinqToSql but I want to validate the Title Property
}

internal class JobOpening_Validation
{
    [Required]
    [StringLength(150, ErrorMessage = "Must be under 150 characters")]
    public string Title { get; set; }
}

使用这个“一次性”(JobOpening_Validation)类,我们创建了我们想要在“目标”(JobOpening)类上验证的相同属性。“一次性”类上的任何属性装饰都将复制到“目标”类。

如果这对您不起作用,您可以创建一个FilterAttribute并覆盖该OnActionExecuting方法并在那里执行您的模型验证。您还可以相应地更新模型状态。

于 2011-02-23T03:04:21.963 回答
0

在尝试使用 MvcExtensions 之后 - 失败是因为太难将它硬塞到我的项目中。最后我找到了一个很棒的小项目,叫做Fluent Validation

它易于使用并易于与 MVC 集成。

于 2011-03-08T21:14:23.313 回答