小编ric*_*rdo的帖子

ASP.NET MVC 3带参数的客户端验证

继本文后,对自定义属性执行客户端验证

我试图了解如何执行此操作,将其他参数传递给客户端脚本

据我所知,到目前为止,使用MVC 3实现自定义验证需要以下内容

创建自定义验证属性

基于ValidationAttribute并实现IClientValidatable.我还看到了一些源自ModelValidator的示例,它似乎实现了ValidationAttribute和IClientValidatable的功能.所以这是关于差异是什么或者ModelValidator是否在MVC 2中使用但现在已被弃用或者是什么的第一个混淆点?

必须从GetClientValidationRules()返回ModelClientValidationRule的实例以指定详细信息,例如错误消息,ValidationType(我理解为将执行客户端验证的Javascript函数的名称)以及属性的任何其他自定义参数可能有,并且需要传递给Javascript验证.

我假设运行时(不确定它的哪一部分)然后使用ModelClientValidationRule标签元素生成html属性,如下所示:

data-val="true"  (to indicate that the element requires validation)
data-val-[ValidationType]=[ErrorMessage]
data-val-[ValidationType].[ValidationParameters(n).Key]=[ValidationParameters(n).Value]
Run Code Online (Sandbox Code Playgroud)

实现客户端验证逻辑

必须使用jQuery.validators.addmethod()创建Javascript函数并将其添加到jQuery.validators,以便JQuery在需要执行时知道它.就像是:

jQuery.validator.addMethod(
    'greaterThan', 
    function (value, element, params) {
        /.../
       return /* true or false   */ ; 
    },
    ''
); 
Run Code Online (Sandbox Code Playgroud)

我的问题是签名'function(value,element,params)'是否是处理验证的方法的标准,我认为它将在适当的时候被某些jQuery功能调用,例如在提交表单之前或者element会丢失fuces或keyUp事件.我只是不知道如何控制这个,即选择适合自定义验证的事件.

实现一个不显眼的适配器

这将不显眼的属性转换为; 我不太清楚,但认为它是一个jQuery规则,但我不清楚这些是如何工作的.就像是

jQuery.validator.unobtrusive.adapters.add(
    'futuredate', 
    { },
    function (options) {
        options.rules['greaterThan'] = true;
        options.messages['greaterThan'] = options.message;
    }
); 
Run Code Online (Sandbox Code Playgroud)

我的问题是'功能(选项)'.这是在'function(value,element,params)'之前调用的函数,负责将不显眼的标记提取到jQuery.Validation可以理解的数据结构中.从代码示例中我可以看出,options是一个对象,它包含来自标记的属性值(例如options.message)和它必须映射到的jQuery相关属性(例如options.messages ['ClientSideValidationFunctionName']如果是这样,如何检索和映射自定义参数.

我希望我没有添加任何额外的困惑.

validation parameters asp.net-mvc client-side asp.net-mvc-3

54
推荐指数
1
解决办法
3万
查看次数

MVC通用ViewModel

总之,我希望能够将通用的ViewModel传递给我的视图

以下是我想要实现的目标的一些简化代码

public interface IPerson
{
    string FirstName {get;}
    string LastName {get;}
}

public class FakePerson : IPerson
{
    public FakePerson()
    {
        FirstName = "Foo";
        LastName = "Bar";
    }

    public string FirstName {get; private set;} 
    public string LastName {get; private set;} 
}

public class HomeViewModel<T> 
    where T : IPerson, new()
{
    public string SomeOtherProperty{ get; set;}
    public T Person { get; private set; }

    public HomeViewModel()
    {
        Person = new T();
    }
}

public class HomeController : Controller {
    public …
Run Code Online (Sandbox Code Playgroud)

asp.net generics asp.net-mvc viewmodel

8
推荐指数
1
解决办法
5472
查看次数

MVC 3自定义模板和EditorForModel混淆

据我所知

给出一个视图模型

public class MyViewModel{
    public DateTime Date {get; set;}
    public MyClass Class {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

.. a View Views\MyController\MyAction.cshtml

@model MyViewModel
@Html.DisplayForModel()
Run Code Online (Sandbox Code Playgroud)

..部分View Views\Shared\DisplayTemplates\DateTime.chstml

@model DateTime
Some Date
Run Code Online (Sandbox Code Playgroud)

..另一部分View Views\Shared\DisplayTemplates\MyClass.cshtml

@model MyClass
My Class
Run Code Online (Sandbox Code Playgroud)

..我应该得到

Date
Some Date
Class
My Class    
Run Code Online (Sandbox Code Playgroud)

..但我得到了

Date
Some Date
Run Code Online (Sandbox Code Playgroud)

因此,似乎DisplayForModel找到DateTime模板但不是我的自定义模板,即使我遵循通过属性类型命名它的约定.

我错过了什么.我正在使用MVC 3并且相信此功能已在MVC 2中提供

asp.net-mvc templates asp.net-mvc-3

8
推荐指数
1
解决办法
4489
查看次数

MVC 3指定远程验证的验证触发器

我已经使用MVC 3不引人注意的验证实现了远程验证,如下所示

该模型

public class MyViewModel {
    [Remote("ValidateAction", "Validation")]
    public string Text { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器

public partial class ValidationController : Controller
{
    public virtual JsonResult ValidationAction(string aTextToValidate)
    {
        if(aTextToValidate == /* some condition */)
            return Json(true, JsonRequestBehavior.AllowGet);
        return Json("This is not valid, Try Again !", JsonRequestBehavior.AllowGet);
    }
}
Run Code Online (Sandbox Code Playgroud)

风景

@using (Html.BeginForm() {
    @Html.TextBoxFor(m => m.Text)
    @Html.ValidationMessageFor(m => m.Text)
}
Run Code Online (Sandbox Code Playgroud)

就是这样,一切正常,但ValidationAction会在每次按键时触发,这是不理想的,我想只是在元素失去焦点时触发,但无法想象如何做到这一点

UPDATE

实际上我已经注意到,默认情况下,验证会触发一次.lur第一次元素失去焦点,但是当尝试纠正它时,验证然后触发onKeyUp.我认为这是预期的功能,并且考虑它可能非常有用.但是,知道是否可以修改此行为会很有用

validation unobtrusive-validation asp.net-mvc-3

5
推荐指数
2
解决办法
6835
查看次数

实体框架4.1动态检索映射的列名称

我正在尝试动态构造一个SQL语句.

我的上下文是动态创建的,使用从EntityTypeConfiguration派生的反射查找类并将它们添加到DbModelBuilder.Configuration.

我的EntityTypeConfiguration类指定HasColumnName将实体属性名称映射到db table列名,我需要构建我的SQL语句.

namespace MyDomain {
    public class TestEntityConfig : EntityTypeConfiguration<TestEntity>{
        Property("Name").HasColumnName("dbName");
    } 
 }
Run Code Online (Sandbox Code Playgroud)

从我所研究的内容来看,似乎我可以通过MetadataWorkspace访问这些信息,我可以通过ObjectContext获取.

我已经设法使用MetadataWorkspace.GetItem("MyDomain.TestEntity",DataSpace.OSpace)检索我感兴趣的实体,这使我可以访问属性,但属性的所有属性都没有给我我的名字.映射的db列,与HasColumnName一起指定.

另外我不清楚DataSpace.OSpace是什么以及为什么我的模型是在这个空间构建的.

如果任何人能够对此有所了解,我将不胜感激

UPDATE

继@ Ladislav的评论.我发现我可以获得如下信息对于类属性

ctx.MetadataWorkspace.GetItem<ClrEntityType>("MyDomain.TestEntity", DataSpace.OSpace)).Members
Run Code Online (Sandbox Code Playgroud)

对于表属性

ctx.MetadataWorkspace.GetItem<EntityType>("CodeFirstDatabaseSchema.TestEntity",SSpace).Members
Run Code Online (Sandbox Code Playgroud)

因此我只知道类型MyDomain.TestEntity和Memeber"Name".我将如何获得"dbName".我是否可以始终假设我的映射类将在CodeFirstDatabaseSchema中创建,以便动态构造标识以从SSpace中检索它,以及如何在SSpace中找到正确的成员.我能做点什么吗

var memIndex = ctx.MetadataWorkspace.GetItem<ClrEntityType>("MyDomain.TestEntity", DataSpace.OSpace)).Members["Name"].Index;

var dbName = ctx.MetadataWorkspace.GetItem<EntityType>("CodeFirstDatabaseSchema.TestEntity",SSpace).Members[memIndex];
Run Code Online (Sandbox Code Playgroud)

entity metadata entity-framework-4.1

5
推荐指数
1
解决办法
3983
查看次数

使用AutoFac注入通用类型参数

我觉得我对使用AutoFac可以做些什么感到困惑,有人可以让我走上正轨.

我有一个基本类型

class PersonBase{ 
    public string SaySomething(){
       return "I am base";
    }
}
Run Code Online (Sandbox Code Playgroud)

我推导出两个具体的课程

class FakePerson : PersonBase{
    public override string SaySomething(){
       return "I'm so Fake";
    }
}

class RealPerson : PersonBase{
    public override string SaySomething(){
       return "I am For Real";
    }
}
Run Code Online (Sandbox Code Playgroud)

创建一个泛型类PersonH​​andler,以处理不同类型的人,并希望PersonH​​andler在适当的时候实例化该人,所以我不想要一个Person实例注入,只需要派生类型

class PersonHandler<T>
    where T : PersonBase, new() {

    T _Person;    

    public DoWork(){
        _Person = new T();
        _Person.SaySomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我尝试使用处理程序,在注册下面详细说明的类型后,会有不同的结果.

var ph = contrainer.Resolve<PersonHandler<PersonBase>>();
ph.DoWork();
Run Code Online (Sandbox Code Playgroud)

我试图按如下方式注册类型

1. vBuilder.RegisterType<PersonHandler<FakePerson>>().As<PersonHandler<PersonBase>>();
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误,说明PersonHandler<FakePerson>不能分配PersonHandler<PersonBase>(或者反过来我不会重新分配哪个)

2. vBuilder.RegisterGeneric<typeof(PersonHandler<>)>
   vBuilder.RegisterType<FakePerson>().As<PersonBase>(); …
Run Code Online (Sandbox Code Playgroud)

generics dependency-injection autofac

3
推荐指数
1
解决办法
4775
查看次数

洋葱架构是否与IoC相矛盾?

杰弗里巴勒莫开创了洋葱建筑,我找到了一个很好的方法.

http://www.headspring.com/jeffrey/onion-architecture-part-4-after-four-years/

然而他的声明"内层定义接口.外层实现接口"似乎与IoC相矛盾,如果我的理解是正确的,它表明Consumer定义接口和提供者实现它,即控制在于消费者而不是提供者.

这个原则对我来说很有意义,因为,想象一下你正在编写一个用户界面,这个原则意味着你可以继续创建你的用户界面,而不需要知道你要调用的服务,因为你负责定义暴露所有的界面.您需要的功能.

所以为此,Jeffreys的声明似乎是一个矛盾,让我困惑于放置契约(接口定义)的位置,因为它似乎暗示:Domain Layer MyEntity IMyService Service MyEntityService:IMyService

由于Domain下没有图层,我在哪里放置IMyEntity.这也意味着我不能创建一个Presentation项目,直到Domain存在并定义了IMyService.

我个人注意到,我在哪里放置IMyEntityRepository和MyEntityRepository?由于服务依赖于IMyEntityRepository,而MyEntityRepository依赖于IMyEntity

inversion-of-control onion-architecture

2
推荐指数
1
解决办法
1345
查看次数