如何在Razor中编写“ Html.BeginForm”


133

如果我这样写:

表单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

实际上我有两个控制器。具有“图像”操作的图像控制器..和具有上传操作的上传控制器..
kk-dev11 2011年

Answers:


200

以下代码可以正常工作:

@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
谢谢。查看我在问题中更新的控制器。它不与剃刀代码工作..
KK-dev11

2
@ user1076915,它不起作用是什么意思?您能具体一点吗?我已经用示例代码更新了我的答案,该示例代码说明了控制器操作的外观。如果您无法在控制器操作中获取上载的文件,则可能意味着您具有嵌套<form>标签(HTML不允许),或者您可能在使用某些JavaScript劫持了常规表单提交并执行了AJAX请求,无法处理文件上传。
Darin Dimitrov

我使用了您的控制器操作,并且使用了剃刀'@using'..但它显示->描述:HTTP404。您正在寻找的资源(或其依赖项之一)可能已被删除,名称更改或被删除。暂时不可用。请查看以下URL,并确保其拼写正确。
kk-dev11 2011年

@ user1076915,何时收到此错误消息?什么时候要呈现上载表单或何时提交表单?在第一种情况下,请确保您具有“ GET上传”操作,该操作将投放Upload.cshtml包含以下代码的视图:public ActionResult Upload() { return View(); }。因此,请确保您有一个名为的控制器,UploadController其中包含两个上载操作:一个用于提供表单,另一个用于处理提交。
Darin Dimitrov

2
可行,但是在POST上下文中,我建议添加:@ Html.AntiForgeryToken();
弗雷德里克·德·琳恩Mirouze
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.