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

Posted

技术标签:

【中文标题】如何在 Razor 中编写“Html.BeginForm”【英文标题】:How to write "Html.BeginForm" in Razor 【发布时间】: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");

【问题讨论】:

动作实际上是“图像”还是“上传/上传”? 其实我有两个控制器。带有“图像”操作的图像控制器..和上传控制器“带有上传操作.. 【参考方案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();

以上是关于如何在 Razor 中编写“Html.BeginForm”的主要内容,如果未能解决你的问题,请参考以下文章

在 Knockout foreach 循环中编写 HTML 代码(通过 Razor 调用)

在 ASP.NET C# 和 Razor 中的变量内编写 HTML 代码

Razor简介

如何使用 ASP.NET Core 同时制作 Razor Page 和 C# 代码框架?

在 ASP.NET Core Razor 页面中更改 cshtml 文件的名称

在 Razor 页面中使用模拟检查用户