使用强类型视图上传 - 问题

时间:2010-11-08 13:35:29

标签: asp.net-mvc upload

我在ASP.NET MVC中使用强类型视图上传时出现问题。 对于视图,input(view)的值为null。我的代码如下:

<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm("Create", "DownloadsSub", FormMethod.Post, new { enctype = "multipart/form-data" }))
   {%>
    <%: Html.ValidationSummary(true)%>

    <fieldset>
        <legend>Informações do download</legend>

        <div class="editor-label">
            Selecione a categoria do download
        </div>
        <div class="editor-field">
            <%: Html.DropDownList("IDCategoriaDownloads", (IEnumerable<SelectListItem>)ViewData["IDCategoriaDownloads"], "Categorias de downloads...")%>
            <%: Html.ValidationMessageFor(model => model.IDCategoriaDownloads)%>
        </div>

        <div class="editor-label">
            Selecione o formato do arquivo
        </div>
        <div class="editor-field">
            <%= Html.DropDownList("IDFormatoArquivo", (IEnumerable<SelectListItem>)ViewData["IDFormatoArquivo"], "Formatos de arquivos...") %>
            <%: Html.ValidationMessageFor(model => model.IDFormatoArquivo)%>
        </div>

        <div class="editor-label">
            Título do download
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.TituloDownload)%>
            <%: Html.ValidationMessageFor(model => model.TituloDownload)%>
        </div>

        <div class="editor-label">
            Descrição do download
        </div>
        <div class="editor-field">
            <%: Html.TextAreaFor(model => model.DescricaoDownload)%>
            <%: Html.ValidationMessageFor(model => model.DescricaoDownload)%>
        </div>

        <div class="editor-label">
            Data de Postagem
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.DataDownload)%>
            <%: Html.ValidationMessageFor(model => model.DataDownload)%>
        </div>

        <div class="editor-label">
            Selecione o arquivo para download
        </div>
        <div class="editor-field">
            <input type="file" id="txtFile" name="txtFile" />
            <%--<%: Html.TextBoxFor(model => model.CaminhoDownload) %>
            <%: Html.ValidationMessageFor(model => model.CaminhoDownload)%>--%>
        </div>

        <div class="editor-label">
            Quantidade inicial de cliques
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.HitsDownload)%>
            <%: Html.ValidationMessageFor(model => model.HitsDownload)%>
        </div>

        <div class="editor-label">
            Qual o tamanho do arquivo em bytes?
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.TamanhoDownload) %>
            <%: Html.ValidationMessageFor(model => model.TamanhoDownload) %>
        </div>

        <div class="editor-label">
            Possui direitos autorais?
        </div>
        <div class="editor-field">
            <%= Html.DropDownList("StatusDireitosAutorais", (IEnumerable<SelectListItem>)ViewData["StatusDireitosAutorais"], "Selecione...")%>
            <%: Html.ValidationMessageFor(model => model.StatusDireitosAutorais)%>
        </div>

        <div class="editor-label">
            Direitos autorais (preencha apenas se houver)
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.CreditosDownload)%>
            <%: Html.ValidationMessageFor(model => model.CreditosDownload)%>
        </div>

        <p>
            <input type="submit" value="Salvar" />
        </p>
    </fieldset>

<% } %>

和控制器

[HttpPost]
    public ActionResult Create(tbDownloads _novoDownload, HttpPostedFileBase arquivoUp)
    {
        //var arquivoUp = this.Request.Files[0];
        string nomeArquivoSalvo = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FilesUpload", "Downloads");
        nomeArquivoSalvo = Path.Combine(nomeArquivoSalvo, Path.GetFileName(arquivoUp.FileName));
        arquivoUp.SaveAs(Server.MapPath("~/FilesUpload/Downloads/") + nomeArquivoSalvo);
        _novoDownload.CaminhoDownload = nomeArquivoSalvo.ToString();

        if (ModelState.IsValid)
        {
            modelo.AddTotbDownloads(_novoDownload);
            modelo.SaveChanges();

            return RedirectToAction("Sucesso", "Mensagens");
        }

        return View(_novoDownload);
    }

想法?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

HttpPostedFileBase属性的名称需要与视图中输入字段的名称相匹配。

在视图中,您将其命名为“txtFile”:

<div class="editor-field">
  <input type="file" id="txtFile" name="txtFile" />
  <%--<%: Html.TextBoxFor(model => model.CaminhoDownload) %>
  <%: Html.ValidationMessageFor(model => model.CaminhoDownload)%>--%>
</div>

但在控制器中,您将其称为:

[HttpPost]
public ActionResult Create(tbDownloads _novoDownload,
                           HttpPostedFileBase arquivoUp)
{ [...] }

如果您将其更改为:

[HttpPost]
public ActionResult Create(tbDownloads _novoDownload,
                           HttpPostedFileBase txtFile)
{ [...] }

它应该都可以。