如何在Razor中编写"Html.BeginForm"

139

如果我这样写:

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");
}

这个操作实际上是“图片”还是“上传/上载”? - J. Steen
实际上我有两个控制器。一个是带有“image”操作的图像控制器,另一个是带有“upload”操作的上传控制器。 - kk-dev11
1个回答

208

以下代码运行良好:

@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>
    }
}

就你的服务器端代码而言,这里是如何进行的步骤:

[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");
}

1
请查看我在问题中更新的控制器。它与Razor代码不兼容。谢谢。 - kk-dev11
2
@user1076915,it doesn't work mean是什么意思?你能具体说明一下吗?我已经更新了我的答案,并提供了一个示例代码,展示了你的控制器操作应该是什么样子的。如果你无法在控制器操作中获取上传的文件,那可能意味着你有嵌套的<form>标签(这在HTML中是不允许的),或者你可能正在使用一些JavaScript来劫持正常的表单提交并进行不支持文件上传的AJAX请求。 - Darin Dimitrov
我使用了你的控制器操作和Razor '@using',但它显示--> 描述:HTTP 404。您正在查找的资源(或其某个依赖项)可能已被删除、更改名称或暂时不可用。请查看以下URL,并确保拼写正确。 - kk-dev11
我两个都有。但只有在我提交浏览的图片时才出现了这个问题。 - kk-dev11
2
可以工作,但在POST上下文中建议添加:@Html.AntiForgeryToken(); - Frédéric De Lène Mirouze
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接