如何在 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>
另一方面,如果您在其他服务器端构造的上下文中编写此代码,例如 if
或 foreach
,则应删除 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,不起作用是什么意思?能不能具体一点。我已经用您的控制器操作的示例代码更新了我的答案。如果您无法在控制器操作中获取上传的文件,这可能意味着您嵌套了<form>
标签(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 代码
如何使用 ASP.NET Core 同时制作 Razor Page 和 C# 代码框架?