2015-10-30 3 views
0

J'ai un contrôleur dans lequel j'ai Create méthode. Mon but est de télécharger l'image avec le nom et le service impliqué pour une personne en particulier.Mon code est parfaitement bien.Mais Je frappe l'erreur "Référence d'objet non défini à l'instance d'un objet" à la ligne "if (leader.Fichier.ContenuLongueur> (2 * 1024 * 1024))" dans le contrôleur.Le code est parfaitement bien.S'il vous plaît laissez moi savoir où je fais erreurObjet Refernce n'est pas mis à l'instance d'un objet -mvc4

Je classe modèle comme celui-ci:

[Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    [Required(ErrorMessage="The Name is required")] 
    [MaxLength(20,ErrorMessage="The Maximum characters allowed is 20")] 
    [MinLength(4,ErrorMessage="The Minimum charcaters allowed is 4")] 
    public string Name { get; set; } 

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

    public int ImageSize { get; set; } 

    [NotMapped] 
    public HttpPostedFileBase File { get; set; } 

    public int MinistryID { get; set; } 

    [ForeignKey("MinistryID")] 
    public virtual Ministry Ministry { get; set; } 

Je classe contrôleur avec méthode de création comme ceci:

public ActionResult Create() 
     { 

      return View(); 
     } 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create(Leader leader) 
     { 
      if (leader.File.ContentLength > (2 * 1024 * 1024)) 
      { 
       ModelState.AddModelError("CustomError", "File size must be 
      less than 2 MB"); 
       return View(); 
      } 
      if (!(leader.File.ContentType == "image/jpeg" || 
      leader.File.ContentType == "image/gif")) 
      { 
       ModelState.AddModelError("CustomError", "File type allowed : 
       jpeg and gif"); 
       return View(); 
      } 

      leader.ImageSize = leader.File.ContentLength; 

      byte[] data = new byte[leader.File.ContentLength]; 
      leader.File.InputStream.Read(data, 0, 
      leader.File.ContentLength); 

      leader.Picture = data; 
      if(ModelState.IsValid) 
      { 
       db.Leaders.Add(leader); 
       db.SaveChanges(); 
      } 
      return View(leader); 

     } 
     } 

La vue de la méthode Create est:

 @model ChurchWebsite.Models.Leader 

@{ 
    ViewBag.Title = "Create"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Create</h2> 

@using (Html.BeginForm()) { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Leader</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Name) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Name) 
      @Html.ValidationMessageFor(model => model.Name) 
     </div> 

     <div> 
      @Html.LabelFor(model=>model.Picture) 
     </div> 
     <div> 
     @using (Html.BeginForm("Upload","Image", FormMethod.Post,new{enctype="multipart/form-data"})) 
      { 
      @Html.TextBoxFor(Model=> Model.File, new{type="file",enctype="multipart/form-data"}) 
      @Html.ValidationMessage("CustomError") 
      </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.MinistryID) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.MinistryID) 
      @Html.ValidationMessageFor(model => model.MinistryID) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 



@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 
+1

Code _My est parfaitement good_ Non pas! Parce que 'File' est' null' (vous n'avez pas de contrôle de formulaire pour télécharger un fichier) –

+0

Copie possible de [Qu'est-ce qu'une exception NullReferenceException et comment la réparer?] (Http://stackoverflow.com/questions/ 4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) –

+0

Et le modèle dans la vue est typeof 'Ministry' mais la méthode POST que vous avez montrée lie à typeof' Leader' Vous n'avez pas même montré le bon code! –

Répondre

1

Vous avez des formes imbriquées, ce qui est html non valide et lorsque vous cliquez sur le bouton soumettre sous la forme intérieure, il affichera la forme extérieure qui ne ont l'attribut enctype="multipart/form-data" et, par conséquent, le fichier n'est pas envoyé et dans le contrôleur, leader.File est null et l'accès à sa propriété ContentLength lève l'exception. Vous devez supprimer l'élément de formulaire imbriqué interne et ajouter l'attribut enctype au formulaire externe.

Votre vue devrait être (html hors de propos supprimés)

@model ChurchWebsite.Models.Leader 
.... 
@using (Html.BeginForm("Create", YourControllerName, FormMethod.Post, new{ enctype="multipart/form-data" })) { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 
    .... 
    @Html.LabelFor(m => m.Name) 
    @Html.EditorFor(m => m.Name) 
    @Html.ValidationMessageFor(m => m.Name) 
    .... 
    @Html.TextBoxFor(m => m.File, new{ type="file" }) // remove the inva;id enctype attribute 
    @Html.ValidationMessage("CustomError") 
    .... 
    @Html.LabelFor(model => model.MinistryID) 
    @Html.EditorFor(model => model.MinistryID) 
    @Html.ValidationMessageFor(model => model.MinistryID) 
    <input type="submit" value="Create" /> 
} 
+0

Désolé Stephen, j'ai essayé votre code.Je ne reçois aucune erreur.Mais je vois que les données ne sont pas stockées dans la base de données –

+0

Est-ce que l'exception a disparu? –

+0

Yep..Il est parti .. @ Stephen –