C# ASP.NET内核模型绑定时如何排除某些列
我在一个ASP.NET MVC项目中工作,我必须将视图模型绑定到视图,但我不希望用户编辑列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”修
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