developer tip

Visual Studio 코드 서식이 Razor 태그에 대해 제대로 작동하지 않는 이유는 무엇입니까?

copycodes 2020. 11. 2. 08:08
반응형

Visual Studio 코드 서식이 Razor 태그에 대해 제대로 작동하지 않는 이유는 무엇입니까?


아니면 VS 코드 서식이 Razor 마크 업에 대해 제대로 작동하는지 물어봐야합니까? 형식은 대부분의 구조에서 작동하지만 'if'블록에서 질식하는 것 같습니다. 아래 코드는 VS로 포맷 된 것과 같습니다. 들여 쓰기를 한 번 더하면이 경우를 고치는 것은 매우 쉽습니다.하지만 저는 일상적인 사용에서 서식을 잘 받아 들였고 내 코드의 대부분에 자주 사용하는 것을 좋아하므로 가능하면 수동 서식을 피하는 것이 좋습니다. 지금은 VS 형식으로 그대로 둡니다.

@{ 
    if (User.Identity.IsAuthenticated)
    {
    <text>Hello </text>
    @Html.Display("@ViewBag.UserName") <text> - </text>
    @Html.ActionLink("Sign Out", "LogOff", "Account", null, new { style = "font-weight: bold;" })
    }
 }

나는 가독성을 위해 예를 들어 위의 경우 if 블록의 본문이 더 멋지게 보이는 것 외에도 들여 쓰기가 중요하다고 생각합니다.


탭이 아닌 공백 문자를 사용하도록 편집기를 설정해야합니다. 탭을 사용할 때 편집기는 완전히 정신을 잃은 것 같습니다. 모든 공백 문자가 실제 HTML 출력으로 끝나고 데이터 전송 크기가 크게 증가하기 때문에 이것은 부끄러운 일입니다. 내가하는 일은 입력 할 때 자동 서식을 수동으로 보완하는 것입니다. 이상적이지는 않지만 Microsoft가 다음 서비스 팩에 대해이를 파악할 수 있기를 바랍니다.


탭 들여 쓰기를 계속 사용하고 올바른 형식을 가질 수있는 하나의 "솔루션"을 찾았습니다. 패턴에 가깝습니다. 핵심은 인라인 코드 대신 면도기 코드 블록을 사용하는 것입니다.

예를 들어 다음을 대체하십시오.

<div>
    <div>
        @if (true)
        {
            <b>Hi</b>
        }
    </div>
</div>

와:

<div>
    <div>
        @{
            if (true)
            {
                <b>Hi</b>
            }
        }
    </div>
</div>

후자는 올바르게 포맷되지만 전자는 포맷되지 않습니다.

형식이 완벽하지는 않지만 이전보다 낫습니다.


해결하기 어려운 문제이기 때문에 모든 경우에 올바르게 작동하지 않습니다. 기본적으로 3 개의 다른 편집기 (HTML, C # 및 Razor)가 모두 동일한 텍스트 버퍼에서 상호 작용합니다. 상호 작용에 버그가있는 경우 (이와 같은)가 있습니다. 그러나 우리는 Razor의 다음 릴리스를 위해 편집기를 개선하기 위해 노력하고 있습니다.


여기서 더 좋은 대안은 (탭에 공백을 사용하는 것보다) HTML 및 C # / VB의 블록 들여 쓰기를 "Smart"대신 "Block"으로 변경하는 것입니다. 이것은 완전한 솔루션은 아니지만 IMO는 공백을 사용하는 것보다 훨씬 덜 고통스러운 해결 방법입니다!


이에 대한 또 다른 해결책을 찾았습니다. 파일의 모든 코드를 선택하고 Shift + 탭을 클릭하여 코드 앞의 모든 탭을 제거하고 복사하여 붙여 넣습니다. Visual Studio는 코드 형식을 자동으로 지정합니다. VS 2013 .cshtml 파일 작업


제 경우에는 서식 옵션을 재정의하는 것이 resharper였습니다.

reshaper를 사용 하고이 문제가 발생하면 이것을 시도하십시오 ...

Resharper >> 옵션 >> Razor >> 편집기 및 서식 >> "입력시 자동 서식"선택 해제


나는 그것이 당신이 찾고있는 답이 아니라는 것을 알고 있지만 WriteLiteral을 사용하여 내 서식 문제를 해결했습니다.

예를 들어, 내가 쓸 때 :

<div>
    @foreach (var item in Model) {    
        if (condition) {
            @:</div><div>
        }
        <a href="@item.Url">@item.Label</a>
    }
</div>

Visual Studio는이를 다음과 같이 변경하려고합니다.

<div>
    @foreach (var item in Model) {    
        if (condition) {
            @:
        </div><div>
        }
        <a href="@item.Url">@item.Label</a>
    }
</div>

이로 인해 페이지에서 오류가 발생합니다.

WriteLiteral을 사용하면 포맷터를 속여 줄을 무시할 수 있지만 예쁘지 않습니다.

<div>
    @foreach (var item in Model) {    
        if (condition) {
            WriteLiteral("</div><div>");
        }
        <a href="@item.Url">@item.Label</a>
    }
</div>

지금은 VS2013 ASP.NET MVC 5를 사용 중이며 여전히 문제가 있습니다. 내가 많이 도움이 된 것은 여는 블록 기호가 ( @{) 인 같은 줄에 첫 번째 표현식을 넣는 것입니다 . 이렇게하면 면도기 코드 서식이 훨씬 더 나은 결과를 얻을 수 있습니다. 다음은 전후 사례입니다.

전에

**BEFORE**

enter image description here


I work with VS2017 15.9.2 and still have the problem.
After change the editor settings to use spaces instead of tabs, the behavior in editing (e.g. copy - paste code lines) is way better, but "Format Document" still add wrong indents by every call.

No solution, but a short update:

It seems as the issue is solved partial in Visual Studio 2019 version 16.0 Preview 2.1
Link to MS for the issue


I recommend you prevent automatic formatting to trigger by commenting the piece of code where you paste. This way things don't get broken on paste.

참고URL : https://stackoverflow.com/questions/6902204/why-doesnt-visual-studio-code-formatting-work-properly-for-razor-markup

반응형