2

I have a basic asp.net c# application which has a form to submit some data to database, This form has an upload button to upload a file.

Initially, there was a problem that: i was not able to submit a form without uploading a file, it was giving an error as [object reference not set to an instance of an object], which means uploading a file was a must before submitting the form, So to resolve that issue i made some changes in my controller.

Now it submits the form even if i don't upload anything, but the new problem is that when i upload a file and submit then it still submits the form successfully but it does not upload the actual file.

This is the model:

  public class Events
{
    public int Id { get; set; }
    public string title { get; set; }
    public string amount { get; set; }
    public string Finance_Approval { get; set; }
    public DateTime date_time { get; set; }

    public string file_one { get; set; }
    [NotMapped]
    public HttpPostedFileBase file1 { get; set; }
}

This is the controller:

    public ActionResult Index()
    {  
        return View();
    }


   public ActionResult Request(Events e)
    {
        if (e.file_one==null)
        {
            _context.evt.Add(e);
            _context.SaveChanges();

            return Content("Added");
        }

        else
        {
            string filename = Path.GetFileNameWithoutExtension(e.file1.FileName);
            string extension = Path.GetExtension(e.file1.FileName);
            filename = filename + DateTime.Now.ToString("yymmssfff") + extension;
            e.file_one = "PM_Files/" + filename;
            filename = Path.Combine(Server.MapPath("~/PM_Files/"), filename);
            e.file1.SaveAs(filename);

            _context.evt.Add(e);
            _context.SaveChanges();

            return Content("Added");
        }

    }

And this is the razor view:

@using (Html.BeginForm("Request", "Requester", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <div class="form-group">
        @Html.LabelFor(a => a.title)
        @Html.TextBoxFor(a => a.title, new { @class = "form-control" })
    </div>
    <div class="form-group">
        @Html.LabelFor(a => a.amount)
        @Html.TextBoxFor(a => a.amount, new { @class = "form-control" })
    </div>
    <div class="form-group">
        <label>Select the file word or pdf etc</label>
        <input type="file" name="file1" />
    </div>    
    <button class="btn btn-primary">Request</button>
}
10
  • 1
    Your file is being uploaded, but you do not have a form control for file_one so its always null - you else block will never be executed Commented Nov 14, 2018 at 4:52
  • You need this one: @Html.TextBoxFor(a => a.file_one, new { @class = "form-control", @readonly = "readonly" }) to store the file name. In your current code this textbox doesn't exist, hence the filename is never captured. Commented Nov 14, 2018 at 4:55
  • @StephenMuecke you mean to say that i have to add the form-control class in upload button and it will resolve the issue Commented Nov 14, 2018 at 4:56
  • No. You do not have a <input> element for file_one (nor should you). What you need to check is if e.file1 is null, not e.file_one` (and you also check the ContentLength) Commented Nov 14, 2018 at 4:59
  • if (e.file_one==null) => this is your problem, because you're checking against file_one string. You should check against file existence, i.e. HttpPostedFileBase. Commented Nov 14, 2018 at 4:59

1 Answer 1

1

The exact problem is you're checking null against file_one string property, which always has null value because no form control associated with it inside view page. You should check against HttpPostedFileBase instead:

[HttpPost]
public ActionResult Request(Events e)
{
    if (e.file1 != null && e.file1.ContentLength > 0)
    {
        // save the file

        return Content("Added");
    }

    else
    {
        // do something else

        return Content("Added");
    }
}

If standard HttpPostedFileBase check above does not work, you should try Request.Files to get the file info:

[HttpPost]
public ActionResult Request(Events e)
{
    if (Request.Files.Count > 0)
    {
        foreach (string files in Request.Files)
        {
             if (!string.IsNullOrEmpty(files))
             {
                 // save the file
             }
        }

        return Content("Added");
    }

    else
    {
        // do something else

        return Content("Added");
    }
}

Notes:

1) The form uses FormMethod.Post, therefore the controller action should use [HttpPost] attribute.

2) [NotMapped] attribute is only used for data models to exclude entity mapping to column in database - it is not used in viewmodels, just remove it.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.