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)
部分视图位于表单标记内,并且只有在共享模型也有效的情况下才会执行服务器端验证.
否则,该页面将被视为有效并将继续,大概是因为共享页面有效,因此重定向.
无论如何,我可以将此窗口小部件作为其添加到的页面的一部分进行验证,而无需更改共享控制器或视图模型中的代码吗?
或者,这只是一个坏主意,是否有更好的方法来实现扩展?
提前致谢