Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 从客户端验证属性获取对象_Asp.net_Asp.net Core - Fatal编程技术网

Asp.net 从客户端验证属性获取对象

Asp.net 从客户端验证属性获取对象,asp.net,asp.net-core,Asp.net,Asp.net Core,我在客户端验证属性中有下一个“AddValidation”方法(继承自ValidationAttribute、IClientModelValidator) 如何获取模型对象以获取属性值?仅当模型对象包含基元类型时,此示例才适用。并且无法处理包含复杂类型的模型对象您可以通过模型直接获取属性,但需要指定其类型 下面是一个演示: 型号: public class TimeModel { public string Name { get; set; } public MyTime MyT

我在客户端验证属性中有下一个“AddValidation”方法(继承自ValidationAttribute、IClientModelValidator)


如何获取模型对象以获取属性值?仅当模型对象包含基元类型时,此示例才适用。并且无法处理包含复杂类型的模型对象

您可以通过
模型
直接获取属性,但需要指定其类型

下面是一个演示:

型号:

public class TimeModel
{
    public string Name { get; set; }
    public MyTime MyTime { get; set; }
}
public class MyTime
{
    [Ranges]
    public DateTime RangeDatetime { get; set; }
}
public class RangesAttribute : ValidationAttribute, IClientModelValidator
{
    public void AddValidation(ClientModelValidationContext context)
    {
        var viewContext = context.ActionContext as ViewContext;
        var modelType = context.ModelMetadata.ContainerType;
        var model = (TimeModel)viewContext?.ViewData.Model;
        var name = model.Name;
        var rangeDatetime = model.MyTime.RangeDatetime
        //...
    }
}
public IActionResult Index()
{
    TimeModel model = new TimeModel
    {
        Name = "AAAAA",
        MyTime = new MyTime {  RangeDatetime = DateTime.Now}
    };

    return View(model);
}
public void AddValidation(ClientModelValidationContext context)
{
    var viewContext = context.ActionContext as ViewContext;
    var model = viewContext.ViewData.Model;
    Dictionary<string, string> myDict = new Dictionary<string, string>();
    Type type = model.GetType();
    foreach (PropertyInfo pi in type.GetProperties())
    {
        var subModel = pi.GetValue(model, null);
        Type subtype = pi.GetValue(model, null).GetType();
        if (!subtype.IsPrimitive && !subtype.Equals(typeof(string)))
        {
            var pii = subtype.GetProperties();
            foreach (PropertyInfo item in pii)
            {
                myDict[item.Name] = item.GetValue(subModel, null)?.ToString();
            }
        }
        else
        {
            myDict[pi.Name] = pi.GetValue(model, null)?.ToString();
        }
    }
}
范围属性:

public class TimeModel
{
    public string Name { get; set; }
    public MyTime MyTime { get; set; }
}
public class MyTime
{
    [Ranges]
    public DateTime RangeDatetime { get; set; }
}
public class RangesAttribute : ValidationAttribute, IClientModelValidator
{
    public void AddValidation(ClientModelValidationContext context)
    {
        var viewContext = context.ActionContext as ViewContext;
        var modelType = context.ModelMetadata.ContainerType;
        var model = (TimeModel)viewContext?.ViewData.Model;
        var name = model.Name;
        var rangeDatetime = model.MyTime.RangeDatetime
        //...
    }
}
public IActionResult Index()
{
    TimeModel model = new TimeModel
    {
        Name = "AAAAA",
        MyTime = new MyTime {  RangeDatetime = DateTime.Now}
    };

    return View(model);
}
public void AddValidation(ClientModelValidationContext context)
{
    var viewContext = context.ActionContext as ViewContext;
    var model = viewContext.ViewData.Model;
    Dictionary<string, string> myDict = new Dictionary<string, string>();
    Type type = model.GetType();
    foreach (PropertyInfo pi in type.GetProperties())
    {
        var subModel = pi.GetValue(model, null);
        Type subtype = pi.GetValue(model, null).GetType();
        if (!subtype.IsPrimitive && !subtype.Equals(typeof(string)))
        {
            var pii = subtype.GetProperties();
            foreach (PropertyInfo item in pii)
            {
                myDict[item.Name] = item.GetValue(subModel, null)?.ToString();
            }
        }
        else
        {
            myDict[pi.Name] = pi.GetValue(model, null)?.ToString();
        }
    }
}
控制器:

public class TimeModel
{
    public string Name { get; set; }
    public MyTime MyTime { get; set; }
}
public class MyTime
{
    [Ranges]
    public DateTime RangeDatetime { get; set; }
}
public class RangesAttribute : ValidationAttribute, IClientModelValidator
{
    public void AddValidation(ClientModelValidationContext context)
    {
        var viewContext = context.ActionContext as ViewContext;
        var modelType = context.ModelMetadata.ContainerType;
        var model = (TimeModel)viewContext?.ViewData.Model;
        var name = model.Name;
        var rangeDatetime = model.MyTime.RangeDatetime
        //...
    }
}
public IActionResult Index()
{
    TimeModel model = new TimeModel
    {
        Name = "AAAAA",
        MyTime = new MyTime {  RangeDatetime = DateTime.Now}
    };

    return View(model);
}
public void AddValidation(ClientModelValidationContext context)
{
    var viewContext = context.ActionContext as ViewContext;
    var model = viewContext.ViewData.Model;
    Dictionary<string, string> myDict = new Dictionary<string, string>();
    Type type = model.GetType();
    foreach (PropertyInfo pi in type.GetProperties())
    {
        var subModel = pi.GetValue(model, null);
        Type subtype = pi.GetValue(model, null).GetType();
        if (!subtype.IsPrimitive && !subtype.Equals(typeof(string)))
        {
            var pii = subtype.GetProperties();
            foreach (PropertyInfo item in pii)
            {
                myDict[item.Name] = item.GetValue(subModel, null)?.ToString();
            }
        }
        else
        {
            myDict[pi.Name] = pi.GetValue(model, null)?.ToString();
        }
    }
}
结果:

public class TimeModel
{
    public string Name { get; set; }
    public MyTime MyTime { get; set; }
}
public class MyTime
{
    [Ranges]
    public DateTime RangeDatetime { get; set; }
}
public class RangesAttribute : ValidationAttribute, IClientModelValidator
{
    public void AddValidation(ClientModelValidationContext context)
    {
        var viewContext = context.ActionContext as ViewContext;
        var modelType = context.ModelMetadata.ContainerType;
        var model = (TimeModel)viewContext?.ViewData.Model;
        var name = model.Name;
        var rangeDatetime = model.MyTime.RangeDatetime
        //...
    }
}
public IActionResult Index()
{
    TimeModel model = new TimeModel
    {
        Name = "AAAAA",
        MyTime = new MyTime {  RangeDatetime = DateTime.Now}
    };

    return View(model);
}
public void AddValidation(ClientModelValidationContext context)
{
    var viewContext = context.ActionContext as ViewContext;
    var model = viewContext.ViewData.Model;
    Dictionary<string, string> myDict = new Dictionary<string, string>();
    Type type = model.GetType();
    foreach (PropertyInfo pi in type.GetProperties())
    {
        var subModel = pi.GetValue(model, null);
        Type subtype = pi.GetValue(model, null).GetType();
        if (!subtype.IsPrimitive && !subtype.Equals(typeof(string)))
        {
            var pii = subtype.GetProperties();
            foreach (PropertyInfo item in pii)
            {
                myDict[item.Name] = item.GetValue(subModel, null)?.ToString();
            }
        }
        else
        {
            myDict[pi.Name] = pi.GetValue(model, null)?.ToString();
        }
    }
}

更新:

public class TimeModel
{
    public string Name { get; set; }
    public MyTime MyTime { get; set; }
}
public class MyTime
{
    [Ranges]
    public DateTime RangeDatetime { get; set; }
}
public class RangesAttribute : ValidationAttribute, IClientModelValidator
{
    public void AddValidation(ClientModelValidationContext context)
    {
        var viewContext = context.ActionContext as ViewContext;
        var modelType = context.ModelMetadata.ContainerType;
        var model = (TimeModel)viewContext?.ViewData.Model;
        var name = model.Name;
        var rangeDatetime = model.MyTime.RangeDatetime
        //...
    }
}
public IActionResult Index()
{
    TimeModel model = new TimeModel
    {
        Name = "AAAAA",
        MyTime = new MyTime {  RangeDatetime = DateTime.Now}
    };

    return View(model);
}
public void AddValidation(ClientModelValidationContext context)
{
    var viewContext = context.ActionContext as ViewContext;
    var model = viewContext.ViewData.Model;
    Dictionary<string, string> myDict = new Dictionary<string, string>();
    Type type = model.GetType();
    foreach (PropertyInfo pi in type.GetProperties())
    {
        var subModel = pi.GetValue(model, null);
        Type subtype = pi.GetValue(model, null).GetType();
        if (!subtype.IsPrimitive && !subtype.Equals(typeof(string)))
        {
            var pii = subtype.GetProperties();
            foreach (PropertyInfo item in pii)
            {
                myDict[item.Name] = item.GetValue(subModel, null)?.ToString();
            }
        }
        else
        {
            myDict[pi.Name] = pi.GetValue(model, null)?.ToString();
        }
    }
}
public void AddValidation(ClientModelValidationContext)
{
var viewContext=context.ActionContext作为viewContext;
var model=viewContext.ViewData.model;
Dictionary myDict=新字典();
Type Type=model.GetType();
foreach(type.GetProperties()中的PropertyInfo pi)
{
var子模型=pi.GetValue(模型,空);
Type subtype=pi.GetValue(model,null).GetType();
如果(!subtype.IsPrimitive&&!subtype.Equals(typeof(string)))
{
var pii=subtype.GetProperties();
foreach(pii中的PropertyInfo项目)
{
myDict[item.Name]=item.GetValue(子模型,null)?.ToString();
}
}
其他的
{
myDict[pi.Name]=pi.GetValue(model,null)?.ToString();
}
}
}


您可以从
context.ModelMetadata.ContainerType并将其与父模型属性类型比较

好点,但是如果我有不同的模型怎么办不仅是TimeModel,而且当模型对象仅包含基本类型时,它会打破这种情况。如果模型是动态的,您可能需要使用反射,请参阅我的更新。很好的解决方案,但它仅在模型中只有一个复杂模型时才有效,请参阅下面我如何解决这种情况的解决方案。