处理@html.Beginform在asp MVC 4中带空字段发送
本文关键字:字段 Beginform @html asp MVC 处理 | 更新日期: 2023-09-27 18:02:17
当发送带有空字段的表单到控制器时,我得到了一些例外。实际上,我没有使用类型化视图,我只是创建了一个表单,通过@Html.BeginForm
发送数据到控制器。当我不输入"dateParution"我得到一个ArgumentException,它说dateParution不能得到空值,当我不输入文件我得到一个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>
}
和控制器
[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)
如果模型绑定器不能通过各自的名称找到DateTime
和long
,它将传递null
。由于这些类型是非空类型,因此无法调用该函数(因为不存在所需的参数)。List<>
和string
没有问题,因为它们本质上可以是null
。
解决方案:使其他类型为空(注意添加的?字符):
public ActionResult Form(List<HttpPostedFileBase> files, DateTime? dateParution, long? IdJournal, string numEditionJournal)
注意,使用Nullable<long>
或long?
是等效的。对于任何其他类型也是如此:)
编辑-更新
但是,如果您需要这些字段(它不应该为null才能正常工作),则应该查看客户端验证。有很多插件可以帮助你做到这一点;如果你想避免依赖,你自己也不难做到。
在最核心的地方,你的网页必须检查这些表单字段是否输入正确。如果不是,你的网页不应该提交表单,而是向用户传递一个错误消息。
看起来您正在为DateTime类型的dateParution参数传递NULL值,并且不允许NULL值
使用jquery验证插件进行客户端验证。
http://jqueryvalidation.org/