Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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
C# ASP.NET内核模型绑定时如何排除某些列_C#_Asp.net Core - Fatal编程技术网

C# ASP.NET内核模型绑定时如何排除某些列

C# ASP.NET内核模型绑定时如何排除某些列,c#,asp.net-core,C#,Asp.net Core,我在一个ASP.NET MVC项目中工作,我必须将视图模型绑定到视图,但我不希望用户编辑列Tracking\u Id,起初我使用 [Bind("Id,ContratId,OrganizationName,ContratDate,StartDate,EndDate,DateUploaded,MediumName,LastEditorUserId")] 但我被迫使用视图模型类,我不能再这样做了,因为我只能在参数上使用该属性。问题是,如果我将呈现的网站输入字段值和“name”修

我在一个ASP.NET MVC项目中工作,我必须将视图模型绑定到视图,但我不希望用户编辑列
Tracking\u Id
,起初我使用

 [Bind("Id,ContratId,OrganizationName,ContratDate,StartDate,EndDate,DateUploaded,MediumName,LastEditorUserId")]
但我被迫使用视图模型类,我不能再这样做了,因为我只能在参数上使用该属性。问题是,如果我将呈现的网站输入字段
和“name”修改为
contrat.Tracking\u Id
,然后提交表单,它会更新
Tracking\u Id
列,我担心这可能会导致安全问题。我对这个框架还是新手,请提前感谢

合同
类:

公共类合同
{
[关键]
公共int Id{get;set;}
公共字符串缩写{get;set;}
[必需]
公共字符串OrganizationName{get;set;}
//[必需]
[数据类型(DataType.Date)]
公共日期时间合同日期{get;set;}
[必需]
[数据类型(DataType.Date)]
公共日期时间起始日期{get;set;}
[数据类型(DataType.Date)]
[必需]
公共日期时间结束日期{get;set;}
[必需]
公共日期时间日期上载{get;set;}
[必需]
公共字符串documentPath{get;set;}
[显示名称(“中”)]
公共字符串MediumName{get;set;}
[外键(“媒体名称”)]
公共虚拟媒体{get;set;}
[显示名称(“上次编辑人”)]
公共字符串LastEditorUserId{get;set;}
[ForeignKey(“LastEditorUserId”)]
公共虚拟应用程序用户{get;set;}
公共字符串跟踪ID{get;set;}
}
视图模型:

public class contractupsertvm
{
[显示名称(“合同文件”)]
公共文件文档路径{get;set;}
公共CONTROTCONTROT{get;set;}
}

您可以使用自定义modelbinding排除
TrackingID
属性

public class ContratUpsertVM
{
    [DisplayName("Contrat Document")]
    public IFormFile documentPath { get; set; }

    [ModelBinder(BinderType = typeof(CustomModelBinder))]
    public Contrat contrat { get; set; }
}
CustomModelBinder.cs:

public class CustomModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException(nameof(bindingContext));
        }
        var model = new Contrat();
        var properties = bindingContext.ModelMetadata.Properties;
        foreach(var property in properties)
        {
            var valueresult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "." + property.Name).FirstOrDefault();
            if (valueresult != null)
            {
                
                if(property.Name != "TrackingID")
                {
                    
                    if (property.ModelType == typeof(DateTime))
                    {
                        model.GetType().GetProperty(property.Name).SetValue(model, Convert.ToDateTime(valueresult));
                    }else if(property.ModelType == typeof(Int32))
                    {
                        model.GetType().GetProperty(property.Name).SetValue(model, int.Parse(valueresult));
                    }
                    else
                    {
                        model.GetType().GetProperty(property.Name).SetValue(model, valueresult);
                    }
                    
                }
            }
        }
        bindingContext.Result = ModelBindingResult.Success(model);
        return Task.CompletedTask;
    }
}
然后将其设置为Contrat属性

public class ContratUpsertVM
{
    [DisplayName("Contrat Document")]
    public IFormFile documentPath { get; set; }

    [ModelBinder(BinderType = typeof(CustomModelBinder))]
    public Contrat contrat { get; set; }
}

BindAttribute
也可以在类上使用,请参见此处,如果无法设计专用视图模型类(仅包含可绑定属性),则需要使用
BindAttribute