12

I need to add the following field at my form

<input type="file" class="input-file" />

I create model and describe this field (the last field)

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Web;

 namespace CorePartners_Site2.Models
 {
     public class FeedbackForm
     {
    public string Name { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
    public string Company { get; set; }
    public string AdditionalInformation { get; set; }
    public HttpPostedFileBase ProjectInformation { get; set; }
     }
 }

and create

@Html.TextBox(null, null, new { type="file", @class="input-file" })

but it doesnt work, I get some exception. What's wrong?

7
  • 1
    What error? And why you define null value to name attribute? I mean use like this: @Html.TextBox("ProjectInformation", null, new { type="file", @class="input-file" }) Commented May 20, 2013 at 7:36
  • yes, I understood now, I create @Html.TextBox("file", null, new { type="file", @class="input-file" }) and I get <input class="input-file" id="file" name="file" type="file" value=""> but I dont need id here. How to create the field without id? Commented May 20, 2013 at 7:41
  • But if you dont use id you cant bind file to model. And one more suggestion, if you use ProjectInformation for id, then mvc will bind file to your model automaticly. Commented May 20, 2013 at 7:44
  • 1
    You should define a name property for htmlHelpers. But you can define what you want for id. I say if you define same like your model, it will bind automaticly. If dont, you should specify it in your controller side Commented May 20, 2013 at 7:50
  • 1
    If you want , I can an write example for you with your model? Commented May 20, 2013 at 7:51

7 Answers 7

17

Model

public class FeedbackForm
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
    public string Company { get; set; }
    public string AdditionalInformation { get; set; }
    public HttpPostedFileBase ProjectInformation { get; set; }
}

View

@model FeedbackForm

@Html.TextBox("Name")
@Html.TextBox("Email")
...
@Html.TextBox("ProjectInformation", null, new { type="file", @class="input-file" })

// submit button

My recommended view (strongly - typed)

@model FeedbackForm

@Html.TextBoxFor(model=>model.Name)
@Html.TextBoxFor(model=>model.Email)
...
@Html.TextBoxFor(model=>model.ProjectInformation, null, new { type="file", @class="input-file" })

// submit button

Controller

[HttpPost]
public ActionResult FeedbackForm(FeedbackForm model)
{
    // this is your uploaded file
    var file = model.ProjectInformation;
    ...

    return View();
}

MVC is using name convention, so if your textbox and model names match, then MVC will bind your inputs to your model.

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

7 Comments

Thank u! If my view was created not strongly-typed, I need to create the view again?
No, just change helpers. Add "-For" suffix to your html helpers, and use lambda expr. like (x => x.someProp) for name specifiying.
Not working when using ajax $(this).serialize() it return ProjectInformation null
@EshaGarg, You cannot upload file with ajax. You must use any plug in.
how can I change the input file button text? now it's set to "Broese..." by default.
|
5

I think you are getting a null because you have not specified the enctype in your form tag.

@using (Html.BeginForm("ActionMethodName", "Controller", FormMethod.Post, new { enctype = "multipart/form-data" })) { }

A working example always help.

Visit http://www.mindstick.com/Articles/cf1e1dd9-fdba-4617-94f0-407223574447/?Upload%20File%20in%20Asp.Net%20Mvc%204

Comments

3

You can use the below syntax

@Html.TextBoxFor(model=>model.Email, new { @type="file", @class="input-file" })

1 Comment

The @ in @type="file" is unnecessary.
2

I solved this problem using enctype="multipart/form-data"

@using (Html.BeginForm("SalvarEvidencia", "Evidencia", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    ...
}

Comments

1

There's nothing wrong with just using the input tag directly in your view. You aren't required to use a helper.

<input type="file" class="input-file" />

Just make sure it's within your BeginForm declaration block.

Comments

0

You need to specify the name of the field. If you don't want a name, nor a value, it's better to just include the field as is in your form.

It doesn't make sense to use a helper, if there's nothing dynamic about it.

Comments

-1
  @using (Html.BeginForm("Action_Name", "Controller_Name",FormMethod.Post))
   {
        @Html.TextBoxFor(m => m.Email, new {@class = "text_field"})
        @Html.ValidationMessageFor(m => m.Email)
   }

1 Comment

How does this answer the question?

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.