2010-02-05 28 views
1

我想使用JavaScript函數內部的一些服務器標籤:訪問服務器標籤在MVC項目

<%=Model.HtmlProperty%> 

在我已經保存在一個隱藏的輸入字段與此值過去,但是當一個屬性包含HTML,您會遇到引號等特殊字符出現問題。我想避免在控制器中編碼和解碼,以避免特殊字符的問題。

Rick Strahl在網絡表單項目中有一個coupleposts在這個問題上,但我正在尋找一個優雅的MVC項目解決方案。

UPDATE:羅伯特哈維的回答下面建議編碼的HTML。再說一次,那不是我想要做的。最終,我試圖將html腳本注入到fckeditor實例中。這必須在JavaScript中完成。我試圖弄清楚如何在javascript中訪問<%=Model.HtmlProperty%>的值,而不將編碼文本存儲在隱藏的輸入元素中。

+0

您可以將它藏在裏面的div內容;裏面的JS變量;作爲返回字符串的JS函數;只是編碼正確。你不能從JS訪問服務器標籤; JS在瀏覽器中工作,可以訪問JS變量,HTML字段,Cookie ...選擇你自己。 – queen3 2010-02-05 21:08:14

回答

0

看來,我希望做的 - 在javascript內使用服務器標籤 - 是不可能的。我一直在一個隱藏的輸入元素中存儲字符串,根據queen3的評論,似乎我將不得不繼續做我一直在做的事情。謝謝各位的意見。

0

從裏克施特拉爾的帖子借款,並改變調用簽名位,編碼一個JavaScript字符串(改變成用於HTML類的擴展方法後)的功能如下:

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

哪應該讓你這樣稱呼它:

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

但是,謝謝你,這不會讓我在JavaScript內部使用服務器標籤。我試圖將html代碼注入fckeditor,而不必將隱藏的輸入html元素中的編碼html存儲。請參閱我上面的更新。 – splatto 2010-02-05 21:08:28

0

使用的HtmlHelper寫上飛腳本..

 

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