通过RenderAction在Asp.Net MVC 4中扩展共享代码时无法进行验证

dav*_*avy 7 asp.net-mvc fluentvalidation

我使用大量共享代码,有时我需要尝试扩展功能而不改变现有的解决方案.我采用了一种模式(或者它是一种反模式?),它允许添加一些"小部件",但它不能完全用于验证.

脚本

我有一个现有的共享控制器,视图模型,验证器(流畅的验证)和视图.我想在视图中添加一个文本框,从用户的角度看它似乎是共享页面的一部分,而不更改任何共享代码.我可以实现我想要的,除了在添加的文本框上进行验证.

我为我的小部件创建了一个控制器,视图模型,验证器和部分视图.然后我在共享视图中使用类似强类型的RenderAction:

@{ Html.RenderAction<MyWidgetController>(x => x.Execute()); }
Run Code Online (Sandbox Code Playgroud)

小部件代码

查看模型

[Validator(typeof(WidgetValidator))]    
public class Widget
{        
    public int? WidgetTest{ get; set; }        
}
Run Code Online (Sandbox Code Playgroud)

小部件验证器

public class TestValidator : AbstractValidator<WidgetViewModel>
{
    public TestValidator()
    {
        RuleFor(x => x.WidgetTest).GreaterThan(-1).WithValidationResource("Widget_Error");
    }
}
Run Code Online (Sandbox Code Playgroud)

小部件控制器

[AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Execute()
    {           
        return PartialView("_widget", model);
    }

    [AcceptVerbs(HttpVerbs.Post)]
    [ChildActionOnly]
    public ActionResult Execute(WidgetViewModel model)
    {                              
        return PartialView("_widget", model);
    }
Run Code Online (Sandbox Code Playgroud)

部分视图位于表单标记内,并且只有在共享模型也有效的情况下才会执行服务器端验证.

否则,该页面将被视为有效并将继续,大概是因为共享页面有效,因此重定向.

无论如何,我可以将此窗口小部件作为其添加到的页面的一部分进行验证,而无需更改共享控制器或视图模型中的代码吗?

或者,这只是一个坏主意,是否有更好的方法来实现扩展?

提前致谢