2010-11-24 61 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; 
} 

這個方法,如果我通過它包含的http://google.com/asp.net mvc 3正則表達式返回編碼的html?

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

我使用的是MVC 3,我難倒剃刀的觀點一些文本返回&lt;a href=&quot;http://google.com/&quot; target=&quot;_blank&quot;&gt;http://google.com/&lt;/a&gt;。 MVC 3中是否存在某種我不知道的新視圖編碼?

+0

該方法實際上並未顯示它在調試器中返回編碼字符串,只是視圖以這種方式寫入。 – brooks 2010-11-24 21:01:35

回答

1

如果您使用@ :(在Razor中)或<%:(在WebForm View Engine中),文本將自動進行html編碼。嘗試@ =或<%=

+0

我發現你在這裏發佈的答案。謝謝,安德魯! – brooks 2010-11-24 21:26:37

1

使您的方法返回IHtmlString以向框架指示您的輸出已被編碼。

的是最簡單的實現是return new HtmlString(anchor);

IHtmlString在.NET 4中實現的,所以如果你在.NET 3.5的時候,你就必須使用@=<%=語法(如@Andrew提到)避免編碼。

+0

感謝您的額外信息。 – brooks 2010-11-24 21:29:28

-1

Htmlstring就是答案。

@(new HtmlString(SomeString)) 
0

我發現這個博客文章(http://www.akngo.com/),顯示如何「包裝」Htmlstring爲方便起見。用法是RawView.SomeString

我一直在使用剃刀引擎 了幾天,現在,我很喜歡它 很多。我從一開始就注意到一個大問題 ,所有字符串都是HTML 編碼。對於我們的用途,當我們 處理JSON字符串時,這變成了一個令人討厭的「功能」 。例如, 給出一個簡單的JSON字符串[ 「1」, 「2」, 「3」, 「4」]

實際HTML此 的編碼輸出成爲,[, , ,]

引號已經逃脫,這是 不期望的輸出。如果我們需要將 發回HTML或XML,我們會 必須再單獨轉義 那些。總體而言,我覺得這相當不利,因爲我們不得不將 包裝在HtmlString中,如 這個StackOverflow帖子所示。

在我們的場景中,我們生成從C# JSON/XML,所以大部分的時間,我們 序列化的數據是 視圖模型內。這將導致我們 做這樣的事情,@(新 HtmlString(View.Foo))@(新 HtmlString(View.Bar))

正如你所看到的,這可以成爲相當 繁瑣。所以我決定 抄襲MVC的一部分來創建一個 RawView。最後,使用將 是,@ RawView.Foo @ RawView.Bar

我也說幹就幹,允許索引操作符的使用 以及萬一 有需要遍歷其與 密鑰列表。 //假設我們有Foo, Bar和Baz在我們的ViewModel @ { List keys = new List {「Foo」,「Bar」,「Baz」}; 的foreach(在密鑰VAR鍵){ @RawView [關鍵] }}

要做到這一點,我需要 重複DynamicViewDataDictionary。 當然,我將其命名爲 DynamicRawViewDataDictionary,public class DynamicRawViewDataDictionary: DynamicObject { private private readonly Func viewThunk; public DynamicRawViewDataDictionary(Func 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() { 返回ViewData.Keys; }

public override bool TryGetMember(GetMemberBinder binder, 

出對象結果) { 結果=的getData(binder.Name); 返回true; }

public override bool TrySetMember(SetMemberBinder binder, 

對象值) { 使用setData(binder.Name,值); 返回true; }

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; 
    } 
} 

的原因複製是 因爲DynamicViewDataDictionary 是一個內部密封類。有 沒辦法,我可以繞過此複製 限制和 粘貼。我對 這個類做出的明顯改變是getData方法。我檢查 以查看該對象是否爲 字符串,如果是,則用 HtmlString()將其包裝。

現在我需要使用這個 WebViewPage內,因爲所有的意見,我有 有 WebViewPage的定製版本,以及。好東西 MS沒有讓這個班級內部的 密封起來,所以我可以很容易地從 繼承下來。我需要做一個通用的和非通用的版本,我只是把這個內部的 一個文件。 public abstract class CustomWebViewPage: WebViewPage private DynamicRawViewDataDictionary _rawData; 公共動態RawView { 得到 { 如果(_rawData == NULL){ _rawData =新DynamicRawViewDataDictionary(()=> ViewData的); } return _rawData; } } }

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

ViewData的); } return _rawData; }} }

對於最終的觸摸真正讓 這項工作,在CSHTML 文件的頂部,你應該有類似的東西, @inherits Namespace.To.CustomWebViewPage

//或@inherits Namespace.To.CustomWebViewPage

既然CSHTML文件從 繼承新CustomWebViewPage,應該 訪問RawView,whic h將 用HtmlString包裝所有字符串。

一旦你有這個地方,你會 仍然需要確保你的新視圖的所有 繼承自 CustomWebViewPage。我強烈推薦使用 在您的 MVC項目中使用自定義代碼模板來生成視圖。這個 將幫助自動化很多的日常任務。