处理@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");
    }

处理@html.Beginform在asp MVC 4中带空字段发送

问题就在这里:

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

如果模型绑定器不能通过各自的名称找到DateTimelong,它将传递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/