gpt4 book ai didi

c# - 如何正确制作 byte[] 字段必填字段?

转载 作者:太空狗 更新时间:2023-10-30 01:23:27 25 4
gpt4 key购买 nike

我需要将模型中的 byte[] 验证为 Required 但每当我使用 Data Annotation [Required] 在上面,它不会做任何事情。即使我选择一个文件,它也会输出错误消息。

详细信息:

型号:

Public class MyClass
{
[Key]
public int ID {get; set;}

[Required]
public string Name {get; set;}

public byte[] Image {get; set;}

[Required]
public byte[] Template {get; set;}
}

查看:

<div class="editor-label">
<%:Html.LabelFor(model => model.Image) %>
</div>
<div class="editor-field">
<input type="file" id="file1" name="files" />
</div>
<div class="editor-label">
<%:Html.Label("Template") %>
</div>
<div class="editor-field">
<input type="file" id="file2" name="files"/>
</div>
<p>
<input type="submit" value="Create" />
</p>

我查看了这些帖子,注意到人们使用自定义验证,但出于某种原因,他们使用 HttpPostedFileBase 作为文件类型,而不是像我一样使用 byte[]当我尝试使用相同的错误时,它会出现缺少 ID 的错误...即使该模型已声明了自己的 ID。

编辑:

上下文 - OnModelCreating 添加到 Report

modelBuilder.Entity<Report>().Property(p => p.Image).HasColumnType("image");
modelBuilder.Entity<Report>().Property(p => p.Template).HasColumnType("image");

请注意,我必须将 image 设置为 ColumnType,因为 Byte array truncation to the length of 4000. 错误。

Controller :

public ActionResult Create(Report report, IEnumerable<HttpPostedFileBase> files)
{

if (ModelState.IsValid)
{
db.Configuration.ValidateOnSaveEnabled = false;

if (files.ElementAt(0) != null && files.ElementAt(0).ContentLength > 0)
{
using (MemoryStream ms = new MemoryStream())
{
files.ElementAt(0).InputStream.CopyTo(ms);
report.Image = ms.GetBuffer();
}
}

if (files.ElementAt(1) != null && files.ElementAt(1).ContentLength > 0)
{
using (MemoryStream ms1 = new MemoryStream())
{
files.ElementAt(1).InputStream.CopyTo(ms1);
report.Template = ms1.GetBuffer();
}

}
db.Reports.Add(report);
db.SaveChanges();

//Temporary save method
var tempID = 10000000 + report.ReportID;
var fileName = tempID.ToString(); //current by-pass for name
var path = Path.Combine(Server.MapPath("~/Content/Report/"), fileName);
files.ElementAt(1).SaveAs(path);

db.Configuration.ValidateOnSaveEnabled = true;
return RedirectToAction("Index");
}

希望您能注意到我遗漏了什么。

最佳答案

RequiredAttribute 检查 null 和空字符串。

public override bool IsValid(object value)
{
if (value == null)
return false;
string str = value as string;
if (str != null && !this.AllowEmptyStrings)
return str.Trim().Length != 0;
else
return true;
}

如果您的字节数组为 null,这会很好地工作,但您可能还想检查一个空数组(没有看到您如何分配 Template 属性的值,我只能猜测就是这种情况)。您可以定义自己的必需属性来为您执行此检查。

public class RequiredCollectionAttribute : RequiredAttribute
{
public override bool IsValid(object value)
{
bool isValid = base.IsValid(value);

if(isValid)
{
ICollection collection = value as ICollection;
if(collection != null)
{
isValid = collection.Count != 0;
}
}
return isValid;
}
}

现在只需将 Template 属性上的 Required 属性替换为我们新的 RequiredCollection 属性即可。

[RequiredCollection]
public byte[] Template {get; set;}

关于c# - 如何正确制作 byte[] 字段必填字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11266721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com