MVC对模型验证提供了良好的支持。脱离了MVC框架又如何实现验证。做一下总结。
1.基于MVC DataAnnotations
http://www.cnblogs.com/hjf1223/archive/2010/11/07/independent-dataannotation-validation.html
2. FluentValidation
废话不多说,FluentValidation和Autofac整合
首先是Model和Validator
[ClassInitialize()]
public static void MyClassInitialize(TestContext testContext)
{
var builder = new ContainerBuilder();
builder.RegisterType<Customer>();
var typeFinder = new WebAppTypeFinder();
var validators = typeFinder.FindClassesOfType(typeof(IValidator<>)).ToList();
var TValidator = typeof(IValidator<>);
foreach (var validator in validators)
{
if (validator.IsGenericType)
{
continue;
}
//第一种
//var type = validator.BaseType.GetGenericArguments()[0];
//builder.RegisterType(type);
//builder.RegisterType(validator).As(TValidator.MakeGenericType(type)).SingleInstance();
//第二种
builder.RegisterType(validator)
.As(validator.FindInterfaces((type, criteria) =>
{
var isMatch = type.IsGenericType && ((Type)criteria).IsAssignableFrom(type.GetGenericTypeDefinition());
return isMatch;
}, typeof(IValidator<>)))
.SingleInstance();
}
container = builder.Build();
}
注册IValidator
builder.RegisterType<Customer>();
var typeFinder = new WebAppTypeFinder();
var validators = typeFinder.FindClassesOfType(typeof(IValidator<>)).ToList();
var TValidator = typeof(IValidator<>);
foreach (var validator in validators)
{
if (validator.IsGenericType)
{
continue;
}
//第一种
//var type = validator.BaseType.GetGenericArguments()[0];
//builder.RegisterType(type);
//builder.RegisterType(validator).As(TValidator.MakeGenericType(type)).SingleInstance();
//第二种
builder.RegisterType(validator)
.As(validator.FindInterfaces((type, criteria) =>
{
var isMatch = type.IsGenericType && ((Type)criteria).IsAssignableFrom(type.GetGenericTypeDefinition());
return isMatch;
}, typeof(IValidator<>)))
.SingleInstance();
}
container = builder.Build();
模型验证
public void BaseTest()
{
var customer = new Customer();
var validator = GetValidator<Customer>();
var results = validator.Validate(customer);
bool validationSucceeded = results.IsValid;
Assert.IsFalse(validationSucceeded);
IList<ValidationFailure> failures = results.Errors;
Assert.AreNotEqual(1,failures.LongCount());
}
public IValidator<T> GetValidator<T>()
{
var instance = container.Resolve<IValidator<T>>();
return instance;
}
3.其他方式
微软企业库Validation Application Block (初级),
参考:
http://www.cnblogs.com/hjf1223/archive/2010/11/07/independent-dataannotation-validation.html
Autofac: http://code.google.com/p/autofac/
fluentvalidation :http://fluentvalidation.codeplex.com/
说到asp.net MVC,我相信很多开发者都会和我一样,赞扬一番,把我们开发者的开发速度又可以提高,并且可以随意的控制生成的html,这应该是Mvc时代如果到来的话,最可能使它成功的原因了。但是赞扬归赞扬,既然他是一种开发模式,我们必须要学习,而且要好好学习。
元旦几天假让我放松了一下,今天正式回归正常,开始我的技术之旅。今天探讨一下Mvc中的分部视图。
提到分部视图,我相信大家会想到和web form时代的对应物ascx分部控件,我们在Mvc时代可以更加轻松的控制分部视图。
要说明分部视图,我们先来讨论一下分部视图可以带给我们的优点:
简单的叙述了一下优点,既然我们能发现优点存在,那么我们就想在实际项目中更好的使用它,毕竟程序员都追求懒,一段代码,三句可以搞定,绝对不会写三句半,当然最小化原则也是我们代码优化的最终目的。
那么究竟在Mvc中有哪些可以实现分部视图的功能呢?以及我们要注意点什么呢?
- Html.Partial(partialName)和html.RenderPartial(partialName) 就是首选。 其实这两个方法我们可以指定任何的.cshtml文件,不一定只是分
部视图。大家来回忆一下分部视图和视图的区别在哪里?就是视图有head、body标签,可以定义js,可以指定母板页,但是在我们用Vs右键添加
分部视图的时候,我们会看到只是一些基本的html标签,没有任何的head、body,但是这不等于我们不可以添加,所以说partialName可以是任
何的视图文件。但是我们最好是创建分部视图,因为我们最终是要把这些分部视图合并成为一个页面,如果只是分部视图的html标签,那么在整
体页面中html标签就会显得很干净。
另外,我们不要在分部视图中定义或者引用css以及js。如果需要我们在整体页面中定义或引用。原因有2:1是我们的分部视图文件和整体页面的
路径可能不在同一个目录下,那么会造成找不到css或js文件的情况。2就是对整体页面的html代码是一种伤害。 - html.Action和html.RenderAction()方法也可以用来作为分部视图使用
具体使用方式我想就不需要细说了,大家对htmlHelper都会非常熟悉,因为常用嘛。
这段时间我在完善仿照博客园的问题,就大量的使用到了分部视图,现在来总结一下,让后来的学习者少走一点弯路。
我相信,每天进步的您,最后一定有一个好的未来。
本文链接
在程序中,当右键单击某个对象时,会有小小的弹出菜单命令。如果你使用过Windows 8,你可能已经遇见到过上下文菜单了。经常在一些不可以选择的对象上右键单击,或者在text文本上进行操作时,会出现上下文菜单。什么时候使用上下文菜单,微软提供了非常详细的指导,下面将介绍如何实现上下文菜单。
1.确定要显示上下文菜单的位置
当我们创建弹出菜单时,首先需要确定出被点击element所在的位置,然后将位置传递给弹出菜单控件。下面的方法是确定element的位置:
privateRect GetPoint(TextBox box)
{
Rect temp = box.GetRectFromCharacterIndex(box.SelectionStart, false);
GeneralTransform transform = box.TransformToVisual(null);
Point point = transform.TransformPoint(new Point());
point.X = point.X + temp.X;
point.Y = point.Y + temp.Y;
return new Rect(point, new Size(temp.Width, temp.Height));
}
2.创建上下文菜单的选项
1)为TextBox添加上下文菜单事件
protected override void OnNavigatedTo(NavigationEventArgs e)
{
InputBox.ContextMenuOpening += InputBox_ContextMenuOpening; //InputBox是UI层的TextBox控件
}
2)当离开这个页面时移除上下文菜单事件
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
InputBox.ContextMenuOpening -= InputBox_ContextMenuOpening;
}
3)创建了一个PopupMenu菜单,并添加了一个command,然后调用ShowForSelectionAsync()方法将其显示出来。
async