ProgramingTip

여러 MvcHtmlString 인스턴스를 연결하는 방법

bestdevel 2020. 11. 8. 10:38
반응형

여러 MvcHtmlString 인스턴스를 연결하는 방법


MSDN 에서 약간의 정보로 인해 MvcHtmlString 인스턴스를 연결하는 방법에 대해 약간의 의구심이 있습니다 .

MvcHtmlString 클래스 는 다시 인코딩되는 안되는 HTML 인코딩을 나타냅니다.

다음과 같은 코드를 사용할 때 노드가 두 번 HTML 인코딩 위험이 있습니까?

var label = Html.LabelFor(model => model.Email);
var textbox = Html.TextBoxFor(model => model.Email);
var validation = Html.ValidationMessageFor(model => model.Email);

var result = MvcHtmlString.Create(
  label.ToString() + textbox.ToString() + validation.ToString());

(참고 : 뷰에서 코드를 사용을 위해 HtmlHelper 확장 메소드로 이동해야합니다.)


귀하의 코드가 있습니다.

MSDN의 코드 조각은 인코딩보기 엔진 (예 : 사용시 .NET 4의 Aspx보기 엔진 <%: %>또는 MVC 3의 Razor보기 엔진)이 개체의 높은 값을 다시 인코딩하지 함을 의미합니다.

예를 들면 다음과 같습니다.

string s = "<tag>";
var hs = MvcHtmlString.Create(s);

<%: s %>  -- outputs "&lt;tag&gt;"
<%: hs %> -- outputs "<tag>"

너무 나쁜 C #은 여기서 + 연산자를 재정의 할 수 없습니다! 대신 확장 방법을 사용하는 것은 무엇입니까?

public static MvcHtmlString Concat(this MvcHtmlString first, params MvcHtmlString[] strings)
{
    return MvcHtmlString.Create(first.ToString() + string.Concat(strings.Select(s => s.ToString())));
}

이것은 아마도 최적화 될 수 있습니다. 그것은 증명하는 것이 매우 간단합니다.

사용 샘플 :

label.Concat(textbox, validation)   

이제 내 블로그를위한 뻔뻔한 플러그 : TagBuilder 또는 HtmlTags를 사용하여 HTML 정리


이 접근 방식을 사용했습니다.

    private static MvcHtmlString Concat(params MvcHtmlString[] items)
    {
        var sb = new StringBuilder();
        foreach (var item in items.Where(i => i != null))
            sb.Append(item.ToHtmlString());
        return MvcHtmlString.Create(sb.ToString());
    }

HtmlHelper의 확장 메서드와 함께 클래스 내에서 사용하는 유틸리티 메서드입니다.


나는 또 다른 방법은 메타 데이터를 사용하는 것입니다.

public static String Concat(params object[] args);

기본적으로 ToStrings는 전달 된 각 개체를 전달한 다음 결과를 연결하고 전달을 반환합니다.

따라서 최종 결과는 다음과 가변적입니다.

var result = MvcHtmlString.Create(
    string.Concat(
        label, textbox, validation
    )
);

참고 URL : https://stackoverflow.com/questions/3460762/how-to-concatenate-several-mvchtmlstring-instances

반응형