gpt4 book ai didi

c# - 在 asp mvc 4 中发送带有空字段的 @html.beginform 时处理异常

转载 作者:太空宇宙 更新时间:2023-11-03 13:22:47 24 4
gpt4 key购买 nike

我在向 Controller 发送带有空字段的表单时遇到一些异常。实际上我并没有使用类型化 View ,我只是创建了一个通过 @Html.BeginForm 将数据发送到 Controller 的表单。当我不输入“dateParution”时,我得到一个 ArgumentException,它说 dateParution can not get null value,当我不输入文件时,我得到一个 NullReferenceException。我想要的是向用户显示一条消息,告知应输入所有字段并避免出现异常页面。

这是我的观点:

@using (Html.BeginForm("Form", "Home", FormMethod.Post, new { @enctype = "multipart/form-data" }))
{
<table cellpadding="2" cellspacing="10">
<tr>
<td>
Choisir journal :
</td>
<td>
@Html.DropDownList("IdJournal")
</td>
</tr>
<tr>
<td>
Numéro de l'édition:
</td>
<td>
<input type="text" name="numEditionJournal" />
</td>
</tr>
<tr>
<td>
Date de parution:
</td>
<td>
<input class="form-control span2" name="dateParution" size="16" type="date" value="12-02-2014" >
</td>
</tr>
<tr>
<td>
Choisirr image:
</td>
<td>
<input type="file" multiple name="files" id="upload"/>
</td>
</tr>
</table>


</div>


<button type="submit" id="load" class="btn btn-primary">Confirmer</button>

}

和我的 Controller

[HttpPost]
public ActionResult Form(List<HttpPostedFileBase> files, DateTime dateParution, long IdJournal, string numEditionJournal)
{


ScanITAPP.Service.ImageRender service = new Service.ImageRender();
/* service.UploadImageToDB(file, dateParution, IdJournal, numEditionJournal);*/
try
{
if (files != null && dateParution != null && numEditionJournal != null)
{
foreach (HttpPostedFileBase file in files)
{

byte[] data;
using (Stream inputStream = file.InputStream)
{
MemoryStream memoryStream = inputStream as MemoryStream;
if (memoryStream == null)
{
memoryStream = new MemoryStream();
inputStream.CopyTo(memoryStream);
}
data = memoryStream.ToArray();
}

string extension = System.IO.Path.GetExtension(file.FileName);
string filename = System.IO.Path.GetFileNameWithoutExtension(file.FileName);

if (extension == ".pdf")
{

using (var image = new MagickImage())
{
image.Quality = 300;
image.Density = new MagickGeometry(144, 144);
image.Read(data);


image.Write("C:\\AnnoncesImages\\" + filename + ".jpg");
byte[] bytes = System.IO.File.ReadAllBytes("C:\\AnnoncesImages\\" + filename + ".jpg");

AnnonceVImgSet annImg = new AnnonceVImgSet();
annImg.Id = 1;

ImgOrgSet img = new ImgOrgSet();

img.User_Id = 1;
img.Journal_Id = IdJournal;
img.dateModif = DateTime.Now;
img.dateParution = dateParution;
img.dateSaisi = DateTime.Now;
img.numEditionJournal = numEditionJournal;

img.image = bytes;
using (Bd_scanitEntities dbContext = new Bd_scanitEntities())
{
dbContext.ImgOrgSet.Add(img);
dbContext.SaveChanges();
}
TempData["Message"] = "Image PDF ajoutée ";
}
}
else
{
service.UploadImageToDB(file, dateParution, IdJournal, numEditionJournal);
TempData["Message"] = "Image ajoutée ";
}
}
return RedirectToAction("Index");
}
else
{
ViewBag.RenderedAlert = "Vous n'avez pas rempli tous les champs";
TempData["Message"] = "Image non ajoutée if";
}



}
catch (ArgumentException)
{
ViewBag.RenderedAlert = "Vous n'avez pas rempli tous les champs";
TempData["Message"] = "Image ajoutée catch";
return View("Index");
}
return View("Index");
}

最佳答案

问题在这里:

public ActionResult Form(List<HttpPostedFileBase> files, DateTime dateParution, long IdJournal, string numEditionJournal)

如果模型绑定(bind)器找不到 DateTimelong通过他们各自的名字,它将通过 null .由于这些类型是不可为 null 的类型,因此无法调用该函数(因为所需的参数不存在)。 List<>string没有问题,因为它们本来就是 ​​null .

解决方案:使其他类型可为空(注意添加的 ? 字符):

public ActionResult Form(List<HttpPostedFileBase> files, DateTime? dateParution, long? IdJournal, string numEditionJournal)

请注意,使用 Nullable<long>long?是等价的。任何其他类型也是如此:)

编辑 - 更新

但是,如果您需要这些字段(它不应该为 null 才能正常工作),您应该研究客户端验证。有很多插件可以帮助您解决这个问题;如果您想避免依赖性,您自己做起来并不难。

最核心的是,您的网页必须检查这些表单字段是否输入正确。如果不是,您的网页不应提交表单,而应向用户转发错误消息。

关于c# - 在 asp mvc 4 中发送带有空字段的 @html.beginform 时处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23543339/

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