면도기에서 "Html.BeginForm"을 작성하는 방법


133

내가 이렇게 쓰면 :

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

실제로 두 개의 컨트롤러가 있습니다. 업로드 작업 ..와 '영상'액션 .. 업로드 컨트롤러 '와 화상 제어기
KK-dev11

답변:


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>

반면에 당신은 같은 같은 다른 서버 측 구조의 컨텍스트 내부에이 코드를 작성하는 경우 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>
    }
}

서버 측 코드에 관한 한 진행 방법은 다음과 같습니다.

[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, 작동하지 않는 것은 무엇입니까? 좀 더 구체적으로 말씀해 주시겠습니까? 컨트롤러 작업의 모양에 대한 샘플 코드로 답변을 업데이트했습니다. 컨트롤러 작업에서 업로드 된 파일을 가져올 수없는 경우 중첩 된 <form>태그 (HTML에서는 허용되지 않음)가 있거나 일반 양식 제출을 가로 채고 AJAX 요청을 수행하는 일부 자바 스크립트를 사용 중일 수 있습니다. 파일 업로드 작업을하지 않습니다.
Darin Dimitrov

컨트롤러 작업과 면도기 '@using'을 사용했지만-> 설명 : HTTP 404가 표시됩니다. 찾고있는 리소스 (또는 해당 종속성 중 하나)가 제거되었거나 이름이 변경되었거나 일시적으로 사용할 수 없습니다. 다음 URL을 검토하여 철자가 올바른지 확인하십시오.
kk-dev11

@ user1076915, 언제이 오류 메시지가 표시됩니까? 업로드 양식을 렌더링하거나 제출할 때? 첫 번째 경우 다음 코드가 포함 GETUpload.cshtml보기를 제공 하는 업로드 조치 가 있는지 확인 하십시오 public ActionResult Upload() { return View(); }.. 따라서 UploadController두 가지 업로드 조치 (양식을 제공하기위한 것 및 제출을 처리하기위한 것)를 포함 하는 제어기가 있는지 확인하십시오 .
Darin Dimitrov

2
작동하지만 POST 컨텍스트에서 다음을 추가하는 것이 좋습니다. @ Html.AntiForgeryToken ();
Frédéric De Lène Mirouze
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.