0

ASP.Net Razer ビューで引用符を使用すると、引用符が ' に置き換えられてしまうため、問題が発生しています。

たとえば、次のように入力します。

@{string test = "String 'with' quotes"}
@test

私は最終的に:

String 'with' quotes

上記の例では、これは望ましいことです。

ただし、次の 2 番目の例を見てください。

@{string myJSFunction = myJSFunction('myString')"}
@myJSFunction 

私は最終的に:

myJSFunction('myString')

その結果、壊れた JavaScript 関数が発生します。

引用符を でエスケープしようとしました\が、効果がないようです。

これが私が直面している実際の問題です:

@using (Ajax.BeginForm(
  "_MonthRanges", 
  "Projects", 
  new { id = ViewBag.InputResourceID }, 
  new AjaxOptions { 
      HttpMethod = "POST", 
      UpdateTargetId = "MonthRanges", 
      InsertionMode = InsertionMode.Replace,
      OnComplete = @myJSFunction
}))

何かアドバイス?

4

3 に答える 3

2

Razor では、@エンコードしてレンダリングします。方法を試すHtml.Raw。このメソッドは、HTML エンコードされていないマークアップを返します。

@Html.Raw(myJSFunction)

したがって、スクリプト ブロックで関数を実行する場合は、次のように実行できます。

@{string myJSFunction = "alert('Rise and Shine')";}
<script type="text/javascript">  
    @Html.Raw(myJSFunction)
</script>
于 2013-04-11T13:53:26.957 に答える
2

@オペレーターは常に文字列を HTML エンコードします。生の文字列値が必要な場合は、を使用します@Html.Raw(myJSFunction)

于 2013-04-11T13:54:08.587 に答える
1

問題の解決策は既に言及されています (Html.Raw()) が、指定されたコード サンプルで @ を使用している理由がわかりません。見た目からすると、割り当てようとすると既にコード ブロックに入っているので、なぜカミソリを使用するのでしょうか。

@using (Ajax.BeginForm(
  "_MonthRanges", 
  "Projects", 
  new { id = ViewBag.InputResourceID }, 
  new AjaxOptions { 
      HttpMethod = "POST", 
      UpdateTargetId = "MonthRanges", 
      InsertionMode = InsertionMode.Replace,
      OnComplete = @myJSFunction
}))

する必要があります

@using (Ajax.BeginForm(
  "_MonthRanges", 
  "Projects", 
  new { id = ViewBag.InputResourceID }, 
  new AjaxOptions { 
      HttpMethod = "POST", 
      UpdateTargetId = "MonthRanges", 
      InsertionMode = InsertionMode.Replace,
      OnComplete = myJSFunction
}))

@ は、ページの StreamWriter に結果を応答に書き込むように指示するものであり、HtmlEncoding の後にページに挿入されることを意図しています。Html.Raw を使用すると、Html エンコーディングの側面がバイパスされますが、あなたのケースでは、自分でページを直接記述してHtml.BeginFormいないため、それを処理できるため、関数の割り当てに @ は必要ありませんOnComplete

更新:わかりました、私が言及するのを忘れていたもう 1 つのことは、AjaxOptions に渡されるメソッドは Javascript 関数のみであり、見た目ではパラメーターがないことです。パラメータは、すべての配線を処理する控えめなスクリプトによって自動的に渡されます。したがって、フォームは次のようになります...

@using (Ajax.BeginForm(
  "_MonthRanges", 
  "Projects", 
  new { id = ViewBag.InputResourceID }, 
  new AjaxOptions { 
      HttpMethod = "POST", 
      UpdateTargetId = "MonthRanges", 
      InsertionMode = InsertionMode.Replace,
      OnComplete = "myJSFunction"
}))

そして、それは残りを処理します。関数に追加のパラメーターを渡す必要がある場合myJSFunctionは、おそらく他の方法でそれらを公開する必要があります。JavaScript変数として、またはそれを他の要素に関連付けて、を使用してアクセスします$("elementselector").data("dataAttributeName")(これは私の推奨および推奨方法です)。目立たない ajax JavaScript ライブラリに対して要求される一般的な変更の 1 つは (Microsoft がこの変更を採用し、それを完了してくれることを望みます) this、ajax イベントをトリガーした要素に のコンテキストを設定することです。したがって、この場合this、フォーム要素と等しくなります。これらすべてを念頭に置いて、ここに私のお勧めがあります。

最初 に: Unobtrusive Ajax スクリプト ファイルを変更して、ソース要素がthisキーワードに割り当てられるようにし、控えめなイベントを処理する JavaScript で使用できるようにします。 この質問は、その内容の概要を示しています(ファイルに 1 行追加されています)。

2番目: フォームのデータ属性の1つに文字列を追加します

@using (Ajax.BeginForm(
    "_MonthRanges",
    "Projects",
    new {id = ViewBag.InputResourceID},
    new AjaxOptions
        {
            HttpMethod = "POST",
            UpdateTargetId = "MonthRanges",
            InsertionMode = InsertionMode.Replace,

            OnComplete = "myJSFunction"
        },
    new { data_parameter_name = "myString" }))

3 番目: イベントを処理する javascriptfunction 内からパラメーターにアクセスします。

<script>
    function myJSFunction(data, textStatus, jqXHR)
    {
        //data, textStatus and jqXHR are set for you by the unobtrusive ajax script file automatically, feel free to use them
        var parameter = $(this).data("parameterName");
        alert(parameter);
    }
</script>
于 2013-04-11T14:30:35.777 に答える