6

이것은 바보 같은 노력처럼 보일 것입니다,하지만 그럼에도 불구하고 배우고 싶은 무언가입니다.MVC 3.0의 Html.BeginForm() 다시 작성 및 눈에 거슬리지 자바 스크립트를 유지

지금은 ASP.NET MVC 3.0에서 @using (Html.BeginForm()) {의 구문을 사용해야하고 이후에 }을 사용하여 양식 블록을 닫아 멋진 '눈에 잘 띄지 않는 javascript'를 얻고 모든 것을 작성하지 않도록하십시오. 손으로 (괜찮습니다).

어떤 이유로 (Read: *OCD*) 나는 그것을 좋아하지 않습니다. 나는 정말로 이것을 할 것이다 ..

@Html.BeginForm() 
<div class="happy-css"> 
</div> 
@Html.EndForm() 

아직 바보 같다? 그래, 각자 자신에게 잘 해줘. 나는 그것이 왜 그것이 어떻게 작용 하는지를 이해하고 그것이 내 취향에 맞도록하고 싶다. 그래서 내가 파기 시작할 첫 번째 장소는 MVC 3.0 소스 그 자체라고 생각했습니다. 그래서 나는 코드 플렉스로 뛰어 올라 BeginForm 확장 메소드를 찾았다.

(http://aspnet.codeplex.com/SourceControl/changeset/view/63452#288009)

그래서 지금은 내 목표를 달성하는 시작하는 방법에 대한 약간의 혼란 스러워요. 코드를 읽으면, 그들은 모두 루트 메소드 (대부분의 확장 메소드가 중복을 피하기 위해 하나의 계층 적 메소드로 간주되기 때문에 모든 메소드가 루트 메소드로 넘어가는 것을 발견했습니다.

private static MvcForm FormHelper(this HtmlHelper htmlHelper, string formAction, FormMethod method, IDictionary<string, object> htmlAttributes) { 
      TagBuilder tagBuilder = new TagBuilder("form"); 
      tagBuilder.MergeAttributes(htmlAttributes); 
      // action is implicitly generated, so htmlAttributes take precedence. 
      tagBuilder.MergeAttribute("action", formAction); 
      // method is an explicit parameter, so it takes precedence over the htmlAttributes. 
      tagBuilder.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true); 

      HttpResponseBase httpResponse = htmlHelper.ViewContext.HttpContext.Response; 
      httpResponse.Write(tagBuilder.ToString(TagRenderMode.StartTag)); 
      return new MvcForm(htmlHelper.ViewContext.HttpContext.Response); 
     } 

이 방법은 눈에 잘 띄지 않는 자바 스크립트와 관련이 있습니다. 나는 단순히 .. 지금처럼 내 검증에 넣어 다음

<form action="/Controller/Action" method="post">

및 ...

@Html.ValidationSummary(false)

을 입력하면 나는 눈에 거슬리지 자바 스크립트를하지 않습니다. 그러나 내가 사용한다면

@using (Html.BeginForm()) { 내가 그렇다. 나는 생성 된 마크 업을 조사해 보았는데 실제로 차이점을 발견 할 수 없었다.

이제는 이상하게 보입니다. 난 그냥 입력하면 ...

@Html.BeginForm() 다음은 내 양식의 모든 코드를 넣어 형태 작동하고 나는 눈에 거슬리지 자바 스크립트를 얻을 수 있지만 수동 끝에 </form>를 입력해야합니다. @Html.EndForm()이 작동하지 않습니다. 그러나 그것의 ontop, 지금 html 바로 아래의 출력 스트림에 쓰여진 텍스트를 얻습니다.

누군가가 나를 깨우 치거나 도와 줄 수 있습니까? 불행하게도 면도기 구문이 지금 좀 더 자세한 도우미를 호출 할 때입니다

@{ Html.BeginForm(...); } 
<div> content</div> 
@{ Html.EndForm(); } 

:

답변

8

당신의 근본적인 질문에 대한 답변은 (즉, 사용하는 방법을 BeginForm/EndForm 구문) 다음과 같은 방법으로 그것을 할 것입니다 (HTML 스 니펫을 반환하는 대다수의 헬퍼와는 대조적으로) 결과물에 출력합니다.당신은 아마과 같이 자신의 확장 메서드를 작성하여 쉽게 만들 수 :

public static IHtmlString FormBegin(this HtmlHelper helper, ...) { 
    helper.BeginForm(...); 
    return new HtmlString(""); 
} 

public static IHtmlString FormEnd(this HtmlHelper helper) { 
    helper.EndForm(); 
    return new HtmlString(""); 
} 
+0

덕분에,이 많은 도움이! – Ciel

+0

양식을 시작과 끝을 별도의 섹션으로 정의해야하므로 많은 도움이되었습니다. 너를 marcind 고맙다. – dreamerkumar

+0

Html.BeginForm 매직을 사용할 때만 눈에 거슬리지 않는 유효성 검사가 왜 효과가 있는지 궁금해하는 사람이 있으면 대답은 http://stackoverflow.com/a/3501759입니다. – bottlenecked

0

그것이 내가 생각 작동하는 이유는 BeginForm 방법은 MvcForm 객체가 아닌 HTML을 반환, 그것은 페이지에 직접 HTML을 기록합니다. 사용 블록이 끝나면 닫히고 닫는 끝 태그를 씁니다. 그것이 텍스트 System.Web.Mvc.Html.MvcForm이 출력에 나타나는 이유입니다. MvcForm 객체가 삭제되지 않기 때문에 수동으로 거기에 닫는 태그를 넣어야합니다.

사용하는 구문은 이렇게 같다 :

@{ MvcForm mf = Html.BeginForm(); /* writes directly to html stream */ } 
<div class="happy-css"> 
</div> 
@{ mf.Dispose(); /* like calling mf.EndForm() */ }