gpt4 book ai didi

c# - 无法使字节成为必填字段

转载 作者:太空狗 更新时间:2023-10-29 23:12:24 25 4
gpt4 key购买 nike

有一个我想上传图片的应用程序。我为此使用字节数组。

图像是必需的,但是当我将该注释放在变量上并尝试创建图像时,它会在应该有图像时给我错误消息。它还返回模型无效。

当我删除 Required 时,它可以工作,但它也可以设置为 null,这是我不想要的。

Stack Overflow 上的主题似乎并不多。

这是我的模型

[Key]
public int InvoiceId { get; set; }

[Required(ErrorMessage = "Company is required")]
public string Company { get; set; }

[Required(ErrorMessage = "Description is required")]
public string Description { get; set; }

[Required(ErrorMessage = "Amount is required")]
public decimal Amount { get; set; }

[Required(ErrorMessage = "Picture of Invoice Required")]
public byte[] PictureOfInvoice { get; set; }

还有我的 Controller :

[HttpPost]
[ValidateAntiForgeryToken]
[Authorize(Roles = "Parish Admin, Priest, Administrator")]
public ActionResult Create([Bind(Include = "InvoiceId,Company,Description,Amount,PictureOfInvoice,DateReceived,ChurchId")] Invoice invoice,HttpPostedFileBase File)
{
if (ModelState.IsValid)
{
if (File != null && File.ContentLength > 0)
{
invoice.PictureOfInvoice = new byte[File.ContentLength];
File.InputStream.Read(invoice.PictureOfInvoice, 0, File.ContentLength);

}
else
{
TempData["Error"] = "Upload an Image";
}

db.Invoices.Add(invoice);
db.SaveChanges();
return RedirectToAction("Index");
}

ViewBag.ChurchId = new SelectList(db.Churches, "ChurchId", "Name", invoice.ChurchId);
return View(invoice);
}

我的 View 以防万一它在那里:

<h2>Add New Invoice</h2>

@if (TempData["Error"] != null)
{
<div style="color:red">@TempData["Error"]</div>
}

@using (Html.BeginForm("Create", "Invoices", FormMethod.Post, new { @class = "form-horizontal", enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary()

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

<div class="form-horizontal">
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.Company, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBoxFor(model => model.Company, new { htmlAttributes = new { @class = "form-control", style = "width:20em;" } })
@Html.ValidationMessageFor(model => model.Company, "", new { @class = "text-danger" })
</div>
</div>

<div class="form-group">
@Html.LabelFor(model => model.Amount, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBoxFor(model => model.Amount,new { htmlAttributes = new { @class = "form-control", style = "width:20em;" } })
@Html.ValidationMessageFor(model => model.Amount, "", new { @class = "text-danger" })
</div>
</div>

<div class="form-group">
@Html.LabelFor(model => model.DateReceived, "DateRecieved", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBoxFor(model => model.DateReceived, new { htmlAttributes = new { @class = "form-control", style = "width:20em;" } })
@Html.ValidationMessageFor(model => model.DateReceived, "", new { @class = "text-danger" })
</div>
</div>

<div class="form-group">
@Html.LabelFor(model => model.Description, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBoxFor(model => model.Description, new { htmlAttributes = new { @class = "form-control", style = "width:20em;" } })
@Html.ValidationMessageFor(model => model.Description, "", new { @class = "text-danger" })
</div>
</div>

<div class="form-group">
@Html.LabelFor(model => model.PictureOfInvoice, "Picture of Invoice", htmlAttributes: new { @class = "control-label col-md-2"})
<div class="col-md-10">
<input type="file" name="File" id="File" style="width: 50%;" />
@Html.ValidationMessageFor(model => model.PictureOfInvoice, "", new { @class = "text-danger" })
<output id="list"></output>
</div>
</div>

<div class="form-group">
@Html.LabelFor(model => model.ChurchId, "Church Name", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownList("ChurchId", null, htmlAttributes: new { @class = "form-control", style = "width:20em;" })
@Html.ValidationMessageFor(model => model.ChurchId, "", new { @class = "text-danger" })
</div>
</div>

<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}

<div>
<u>
@Html.ActionLink("Back to List", "Index")
</u>
</div>


<script src="~/Scripts/jquery.datetimepicker.js"></script>

<script>
$('#DateReceived').datetimepicker({
format: 'd/m/Y',
weeks: true,
disableWeekDays: [0, 1, 3, 4, 5, 6],
timepicker: false,
inline: false
});

function handleFileSelect(evt) {
var files = evt.target.files; // FileList object

// Loop through the FileList and render image files as thumbnails.
for (var i = 0, f; f = files[i]; i++) {

// Only process image files.
if (!f.type.match('image.*')) {
continue;
}

var reader = new FileReader();

// Closure to capture the file information.
reader.onload = (function (theFile) {
return function (e) {
// Render thumbnail.
var span = document.createElement('span');
span.innerHTML = ['<img class="thumb" src="', e.target.result,
'" title="', escape(theFile.name), '"/>'
].join('');
document.getElementById('list').insertBefore(span, null);
};
})(f);

// Read in the image file as a data URL.
reader.readAsDataURL(f);
}
}

document.getElementById('File').addEventListener('change', handleFileSelect, false);
</script>

最佳答案

这里的问题混合在一起会导致问题。您似乎正在尝试使用实体作为 View 的模型,并使其同时满足 UI 验证和持久性验证。

将两个问题分开。

创建特定于所需 View 行为的 View 模型。该模型还应包括 IEnumerable<SelectListItem> ChurchList属性来填充下拉列表。

public class CreateInvoiceViewModel {

[Required(ErrorMessage = "Company is required")]
public string Company { get; set; }

[Required(ErrorMessage = "Description is required")]
public string Description { get; set; }

[Required(ErrorMessage = "Amount is required")]
public decimal Amount { get; set; }

[Required(ErrorMessage = "Picture of Invoice Required")]
public HttpPostedFileBase File { get; set; }

public int ChurchId { get; set; }

public IEnumerable<SelectListItem> ChurchList { get; set; }

//...other properties
}

并将其设置为 View 的模型

@model CreateInvoiceViewModel

如果创建新发票,则尚未分配 ID。这意味着当您发布当前拥有的模型时,模型状态不能有效为 InvoiceId , 标记为 Required不提供。

上传的文件(发票图片)也应该包含在 View 模型中,应该使用@Html.TextBoxFor(m => m.File, new { type = "file" })获得客户端验证。模型绑定(bind)器将根据是否提供匹配输入来设置该属性。

<div class="form-group">
@Html.LabelFor(model => model.File, "Picture of Invoice", htmlAttributes: new { @class = "control-label col-md-2"})
<div class="col-md-10">
@Html.TextBoxFor(model => model.File, new { type = "file", style = "width: 50%;"})
@Html.ValidationMessageFor(model => model.File, "", new { @class = "text-danger" })
<output id="list"></output>
</div>
</div>

<div class="form-group">
@Html.LabelFor(model => model.ChurchId, "Church Name", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.ChurchId, (IEnumerable<SelectListItem>)@Model.ChurchList, htmlAttributes: new { @class = "form-control", style = "width:20em;" })
@Html.ValidationMessageFor(model => model.ChurchId, "", new { @class = "text-danger" })
</div>
</div>

所以现在在 Controller 端,[Bind]应该删除,因为在使用 View 模型时不需要它。

[HttpGet]
[Authorize(Roles = "Parish Admin, Priest, Administrator")]
public ActionResult Create() {
var model = new CreateInvoiceViewModel {
//set default property values as needed
};

model.ChurchList = new SelectList(db.Churches, "ChurchId", "Name");

//...

return View(model);
}

[HttpPost]
[ValidateAntiForgeryToken]
[Authorize(Roles = "Parish Admin, Priest, Administrator")]
public ActionResult Create(CreateInvoiceViewModel model) {
if (ModelState.IsValid) {
var file = model.File;
//copy properties over to entity
var invoice = new Invoice {
Company = model.Company,
Description = model.Description,
Amount = model.Amount,
DateReceived = model.DateReceived,
ChurchId = model.ChurchId,
//create array for file contents
PictureOfInvoice = new byte[file.ContentLength]
};
//populate byte array
file.InputStream.Read(invoice.PictureOfInvoice, 0, file.ContentLength);

db.Invoices.Add(invoice);
db.SaveChanges();
return RedirectToAction("Index");
}
//if we get this far model state is invalid.
//return view with validation errors.
model.ChurchList = new SelectList(db.Churches, "ChurchId", "Name", model.ChurchId);
return View(model);
}

如果模型要求无效,模型状态将提供必要的反馈。无需使用临时数据和文件检查。

关于c# - 无法使字节成为必填字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50041806/

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