Pergunta

Eu gostaria de usar algumas tags do servidor dentro de uma função JavaScript:

<%=Model.HtmlProperty%>

No passado, eu ter guardado esse valor em um campo de entrada escondido, mas quando uma propriedade contém HTML você tiver problemas com caracteres especiais, como aspas. Eu gostaria de evitar ter de codificar e decodificar no controlador para evitar problemas com caracteres especiais.

Rick Strahl tem um casal mensagens sobre este problema em um web formulários de projeto, mas eu estou procurando uma solução elegante para um MVC projeto.

Atualizar : A resposta de Robert Harvey abaixo sugere para codificar o html. Novamente, isto não é o que eu quero fazer . Em última análise, eu estou tentando injetar script de html em uma instância fckeditor. Isso deve ser feito em javascript. Eu estou tentando descobrir como acessar o valor de <%=Model.HtmlProperty%> dentro javascript sem armazenar texto codificado em um elemento de entrada oculto.

Foi útil?

Solução 2

Parece que o que eu estava esperando para fazer - usando tags do servidor dentro javascript - não é possível. Eu tinha sido armazenar a string dentro de um elemento de entrada oculto, e de acordo com o comentário de queen3, parece que vou ter que continuar fazendo o que eu tenho feito o tempo todo. Obrigado a todos por sua entrada.

Outras dicas

O empréstimo da postagem de Rick Strahl, e mudando a assinatura chamar um pouco, a função para codificar uma string javascript (depois de mudar-lo em um método de extensão para a classe Html) parece com isso:

public static string EncodeJsString(this HtmlHelper h, string s)
{
    StringBuilder sb = new StringBuilder();
    sb.Append("\"");
    foreach (char c in s)
    {
        switch (c)
        {
            case '\"':
                sb.Append("\\\"");
                break;
            case '\\':
                sb.Append("\\\\");
                break;
            case '\b':
                sb.Append("\\b");
                break;
            case '\f':
                sb.Append("\\f");
                break;
            case '\n':
                sb.Append("\\n");
                break;
            case '\r':
                sb.Append("\\r");
                break;
            case '\t':
                sb.Append("\\t");
                break;
            default:
                int i = (int)c;
                if (i < 32 || i > 127)
                {
                    sb.AppendFormat("\\u{0:X04}", i);
                }
                else
                {
                    sb.Append(c);
                }
                break;
        }
    }
    sb.Append("\"");

    return sb.ToString();
}

Qual deve permitir que você chamá-lo assim:

<%= Html.EncodeJsString(Model.HtmlProperty) %>

Use HtmlHelper para escrever seu script on the fly ..


public static string WriteLightboxScript(this HtmlHelper helper, string galleryName)
        {
            var builder = new TagBuilder("script");
            builder.MergeAttribute("type", "text/javascript");
            builder.SetInnerText("$(function() {$('a[rel=" + galleryName + "]').lightBox();});");
            return builder.ToString(TagRenderMode.Normal);
        }

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top