【问题标题】:How to write "Html.BeginForm" in Razor如何在 Razor 中编写“Html.BeginForm”
【发布时间】:2012-01-11 11:49:48
【问题描述】:

如果我这样写:

form action="Images" method="post" enctype="multipart/form-data"

它有效。

但在带有“@”的 Razor 中它不起作用。我有错吗?

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

    <fieldset>

        Select a file <input type="file" name="file" />
        <input type="submit" value="Upload" />

    </fieldset>
}

我的控制器如下所示:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Upload() 
{
    foreach (string file in Request.Files)
    {
        var uploadedFile = Request.Files[file];
        uploadedFile.SaveAs(Server.MapPath("~/content/pics") + 
                                      Path.GetFileName(uploadedFile.FileName));
    }

    return RedirectToAction ("Upload");
}

【问题讨论】:

  • 动作实际上是“图像”还是“上传/上传”?
  • 其实我有两个控制器。带有“图像”操作的图像控制器..和上传控制器“带有上传操作..

标签: forms asp.net-mvc-3 razor


【解决方案1】:

以下代码可以正常工作:

@using (Html.BeginForm("Upload", "Upload", FormMethod.Post, 
                                      new { enctype = "multipart/form-data" }))
{
    @Html.ValidationSummary(true)
    <fieldset>
        Select a file <input type="file" name="file" />
        <input type="submit" value="Upload" />
    </fieldset>
}

并按预期生成:

<form action="/Upload/Upload" enctype="multipart/form-data" method="post">    
    <fieldset>
        Select a file <input type="file" name="file" />
        <input type="submit" value="Upload" />
    </fieldset>
</form>

另一方面,如果您在其他服务器端构造的上下文中编写此代码,例如 ifforeach,则应删除 using 之前的 @。例如:

@if (SomeCondition)
{
    using (Html.BeginForm("Upload", "Upload", FormMethod.Post, 
                                      new { enctype = "multipart/form-data" }))
    {
        @Html.ValidationSummary(true)
        <fieldset>
            Select a file <input type="file" name="file" />
            <input type="submit" value="Upload" />
        </fieldset>
    }
}

就您的服务器端代码而言,这里是how to proceed

[HttpPost]
public ActionResult Upload(HttpPostedFileBase file) 
{
    if (file != null && file.ContentLength > 0) 
    {
        var fileName = Path.GetFileName(file.FileName);
        var path = Path.Combine(Server.MapPath("~/content/pics"), fileName);
        file.SaveAs(path);
    }
    return RedirectToAction("Upload");
}

【讨论】:

  • 谢谢。查看我在问题中更新的控制器。它不适用于 Razor 代码..
  • @user1076915,不起作用是什么意思?能不能具体一点。我已经用您的控制器操作的示例代码更新了我的答案。如果您无法在控制器操作中获取上传的文件,这可能意味着您嵌套了&lt;form&gt; 标签(HTML 中不允许这样做),或者您可能正在使用一些 javascript 劫持正常表单提交并执行 AJAX 请求这不适用于文件上传。
  • 我使用了您的控制器操作和剃须刀“@using”.. 但它显示 --> 描述:HTTP 404。您正在寻找的资源(或其依赖项之一)可能已被删除,已更改名称,或暂时不可用。请检查以下 URL 并确保其拼写正确。
  • @user1076915,您何时收到此错误消息?当您要呈现上传表单或提交表单时?在第一种情况下,请确保您有一个 GET Upload 操作,它将为包含以下代码的 Upload.cshtml 视图提供服务:public ActionResult Upload() { return View(); }。因此,请确保您有一个名为 UploadController 的控制器,其中包含两个上传操作:一个用于提供表单,另一个用于处理提交。
  • 有效,但在 POST 上下文中我建议添加:@Html.AntiForgeryToken();
猜你喜欢
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
相关资源
最近更新 更多