2010-11-24 11 views
0
public static string MakeAnchor(string text) 
{ 
    string pattern = @"((?<Protocol>\w+):\/\/(?<Domain>[\[email protected]][\w.:@]+)\/?[\w\.?=%&=\[email protected]/$,]*)"; 
    Regex r = new Regex(pattern, RegexOptions.Multiline); 
    var anchor = r.Replace(text, "<a href=\"$1\" target=\"_blank\">$1</a>"); 
    return anchor; 
} 

Diese Methode gibt &lt;a href=&quot;http://google.com/&quot; target=&quot;_blank&quot;&gt;http://google.com/&lt;/a&gt; wenn ich es etwas Text passieren enthält http://google.com/asp.net mvc 3 regulärer Ausdruck, der codiertes HTML zurückgibt?

statt &lt;a href=&quot;http://google.com/&quot; target=&quot;_blank&quot;&gt;http://google.com/&lt;/a&gt;

Ich verwende Rasierapparat Ansichten mit MVC 3. Ich bin ratlos. Gibt es in MVC 3 eine neue Ansichtskodierung, von der ich nichts weiß?

+0

Die Methode zeigt nicht wirklich, dass es die codierte Zeichenfolge im Debugger zurückgibt, es ist nur, dass die Ansicht es auf diese Weise schreibt. – brooks

Antwort

1

Wenn Sie @: (in Razor) oder <%: (in der WebForm View Engine) verwenden, wird der Text automatisch HTML-codiert. Versuchen Sie @ = oder <% =

+0

Ich fand die Antwort, wie Sie hier gepostet haben. Danke, Andrew! – brooks

1

Lassen Sie Ihre Methode eine IHtmlString zurückgeben, um dem Framework anzuzeigen, dass Ihre Ausgabe bereits codiert ist.

Die einfachste Implementierung davon ist return new HtmlString(anchor);

IHtmlString ist in .NET 4 implementiert, so dass, wenn Sie in .NET 3.5 sind, werden Sie die @= oder <%= Syntax verwenden müssen (wie @Andrew Nennungen) um die Kodierung zu vermeiden.

+0

danke für die extra Info. – brooks

-1

Htmlstring ist die Antwort.

@(new HtmlString(SomeString)) 
0

Ich fand dieses Blog-Post (http://www.akngo.com/), die zeigt, wie der Bequemlichkeit halber Htmlstring zu "verpacken". Die Nutzung wird RawView.SomeString

Ich habe für ein paar Tage jetzt den Razor Motor benutze, und ich mag es eine viel. Ich bemerkte ein großes Problem richtig von Anfang an, alle Zeichenfolgen sind HTML codiert. Für unsere Zwecke wird dies ein ziemlich lästiges "Feature", wenn wir mit JSON-Strings beschäftigen. Zum Beispiel einen einfach JSON String angegeben, [ "1", "2", "3", "4"]

Die tatsächliche HTML codierte Ausgabe dieser wurde, [, , " " 3, 4 " "]

die Zitate entgangen sind, welche ist nicht die gewünschte Ausgabe. Wenn wir HTML zurück senden, oder XML, müssten wir dann einzeln diese entziehen. Insgesamt finde ich das ziemlich ärgerlich, da wir es innerhalb eines HtmlString wickeln müssten, wie in dieses StackOverflow Post gezeigt.

In unserem Szenario generieren wir JSON/XML aus C#, so die meiste Zeit, unsere serialisierten Daten ist innerhalb des Ansichtsmodell. Die in uns tun Dinge wie @ (neu HtmlString (View.Foo)) @ (neu HtmlString (View.Bar))

Wie Sie sehen würde, kann dieser sich ganz umständlich.Also entschied ich mich zu Plagiat Teil von MVC, um eine RawView zu erstellen. Am Ende wird die Nutzung sein, @ RawView.Foo @ RawView.Bar

Ich ging weiter auch als auch bei der Nutzung des Index-Operator zu ermöglichen gibt es eine Notwendigkeit, eine Schleife über sie mit einem Liste der Schlüssel. // Angenommen wir haben Foo, Bar und Baz in unserem ViewModel @ { List keys = new List {"Foo", "Bar", "Baz"}; foreach (var Schlüssel in Schlüsseln) { @RawView [key] }}

Um dies zu erreichen, würde ich zu doppelten DynamicViewDataDictionary benötigen. Natürlich habe ich nannte es DynamicRawViewDataDictionary, öffentliche Klasse DynamicRawViewDataDictionary: Dynamic { privaten Nur-Lese-Func viewThunk; public DynamicRawViewDataDictionary (Funktion viewThunk) { this.viewThunk = viewThunk; }

private ViewDataDictionary ViewData 
    { 
     get 
     { 
      ViewDataDictionary viewData = this.viewThunk(); 
      return viewData; 
     } 
    } 

    public object this[string key] 
    { 
     set { setData(key, value); } 
     get { return getData(key); } 
    } 

    public override IEnumerable<string> 

GetDynamicMemberNames() { return ViewData.Keys; }

public override bool TryGetMember(GetMemberBinder binder, 

out Objekt Ergebnis) { result = getData (binder.Name); Rückkehr wahr; }

public override bool TrySetMember(SetMemberBinder binder, 

Objektwert) { setData (binder.Name, value); Rückkehr wahr; }

private object getData(string key) 
    { 
     object value = ViewData[key]; 
     if (value is string) 
     { 
      return new HtmlString(value.ToString()); 
     } 

     return value; 
    } 

    private void setData(string key, object value) 
    { 
     ViewData[key] = value; 
    } 
} 

Der Grund für die Vervielfältigung ist weil die DynamicViewDataDictionary eine interne versiegelte Klasse ist. Es gab keine Möglichkeit, um diese Einschränkung außer Kopieren und Einfügen zu umgehen. Die offensichtliche Änderung, die ich an dieser Klasse vorgenommen habe, ist die Methode getData. I überprüft, ob das Objekt eine Zeichenfolge ist, wenn es ist, habe ich es mit einem HtmlString() umwickelt.

Jetzt muss ich diese innerhalb eines WebViewPage verwenden, da alle Ansichten, ich eine angepasste Version eines WebViewPage auch haben müssen. Gute Sache, dass MS hat diese Klasse intern versiegelt, so kann ich leicht von es erben. Ich musste eine generische und eine nicht generische Version machen, ich plopped beides innerhalb einer Datei. öffentliche abstrakte Klasse CustomWebViewPage: WebViewPage { private DynamicRawViewDataDictionary _rawData; öffentliche dynamische RawView { erhalten { if (_rawData == null) { _rawData = new DynamicRawViewDataDictionary (() => Viewdata); } Rückgabe _rawData; } } }

public abstract class CustomWebViewPage : WebViewPage 
{ 
    private DynamicRawViewDataDictionary _rawData; 
    public dynamic RawView 
    { 
     get 
     { 
      if (_rawData == null) 
      { 
       _rawData = new DynamicRawViewDataDictionary(() => 

Viewdata); } Rückgabe _rawData; } } }

Für den letzten Schliff tatsächlich diese Arbeit zu machen, an der Spitze der cshtml Datei, sollten Sie so etwas wie haben, @inherits Namespace.To.CustomWebViewPage

// oder @inherits Namespace.To.CustomWebViewPage

Nun, da die cshtml Datei von den neuen CustomWebViewPage erbt, sollte es Zugang zu RawView haben, whic h wird alle Zeichenfolgen mit einem HtmlString umschließen.

Sobald Sie dies an Ort und Stelle haben, werden Sie noch brauchen, um sicherzustellen, dass alle Ihre neue Ansichten von CustomWebViewPage erbt. Ich empfehle mit benutzerdefinierten Codevorlagen in Ihrem MVC-Projekt, um die Ansicht zu generieren. Diese hilft bei der Automatisierung einer Menge der alltäglichen Aufgaben.