2012-12-20 8 views
11

Quando si preme invio, il parametro file è nullo.Il modello è nullo quando viene inviato il modulo

public ActionResult Create() 
{ 
    return View(new FileViewModel()); 
} 

[HttpPost]  
[InitializeBlobHelper] 
public ActionResult Create(FileViewModel file) 
{ 
    if (ModelState.IsValid) 
    { 
    //upload file 
    } 
    else 
    return View(file); 
} 

public class FileViewModel 
{ 
    internal const string UploadingUserNameKey = "UserName"; 
    internal const string FileNameKey = "FileName"; 

    internal const string Folder = "files"; 

    private readonly Guid guid = Guid.NewGuid(); 

    public string FileName 
    { 
    get 
    { 
     if (File == null) 
     return null; 
     var folder = Folder; 
     return string.Format("{0}/{1}{2}", folder, guid, Path.GetExtension(File.FileName)).ToLowerInvariant(); 
    } 
    } 

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

Ecco la cshtml:

@model MyProject.Controllers.Admin.FileViewModel 

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

@using (Html.BeginForm("Create", "Files", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <fieldset> 
    <legend>Create</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.File) 
    </div> 
    <div class="editor-field"> 
     @Html.TextBoxFor(model => model.File, new { type = "file" }) 
     @Html.ValidationMessageFor(model => model.File) 
    </div> 

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

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

risposta

37

E 'la denominazione di conflitto e legante cercando di legare la vostra proprietà del file per oggetto FileViewModel con il nome del file, è per questo che si ottiene nulla. I nomi POST non fanno distinzione tra maiuscole e minuscole.

Cambio:

public ActionResult Create(FileViewModel file) 

A:

public ActionResult Create(FileViewModel model) 

o per qualsiasi altro nome

+0

Shiat! Non credevo che avrebbe funzionato, ma è successo. Perché davvero è successo? – Shimmy

+4

@Shimmy È il nome del conflitto e del binder che cerca di associare la proprietà 'File' all'oggetto' FileViewModel' con il nome 'file', ecco perché ottieni' null'. I nomi POST non fanno distinzione tra maiuscole e minuscole. – webdeveloper

+1

Sei un brav'uomo! Buona pesca! – Shimmy

1

Ciò ha risolto il mio problema pure. Era un nome che stavo usando che era simile al modello, che era simile alla variabile che ho assegnato anche al modello pubblicato. una volta risolto il nome del campo, tutto ha funzionato come previsto.

Ovviamente l'errore non è stato utile per farlo notare.