2011-12-02 80 views
104

如果我写这样的:如何写 “Html.BeginForm” 剃刀

形式行动= “图像” 方法= “邮报” ENCTYPE = “的multipart/form-data的”

它的工作原理是

但在剃刀与'@'它不起作用。我犯了什么错误吗?

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

是动作实际上是“图片”或者是“上传/上传”? –

+0

其实我有两个控制器。 图像控制器'图像'行动..和上传控制器'上传行动.. –

回答

160

下面的代码工作正常:

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

谢谢。看看我在问题中更新的控制器。它不适用于剃刀代码.. –

+2

@ user1076915,*它不工作意味着什么*?你能更具体一点吗?我已经使用示例代码更新了我的答案,您的控制器操作可能如何。如果您无法在控制器操作中获取上传的文件,这可能意味着您嵌套了'

'标记(HTML中不允许),或者您可能使用某些JavaScript劫持了常规表单提交并执行AJAX请求这不适用于文件上传。 –

+0

我用你的控制器动作和剃刀'@using'..但它显示 - > 描述:HTTP 404.你正在寻找的资源(或它的一个依赖项)可能已被删除,名称改变了,或暂时不可用。请检查以下网址并确保它拼写正确。 –