0

次のようにビューバッグにリストを割り当てています。

ViewBag.MyArray = GetSomeIEnumerable();

クライアントでは、ページをレンダリングし、onloadで実行された JS の要素に次のような修正文字列でアクセスできます。

$(document).ready(function () {
  var output = "Info: @(ViewBag.MyArray["honka"]["ponka"])";
  alert(output);
}

ただし、次のようにインデックスが変数として指定されている場合、要素にアクセスする方法は明確ではありません。

$(document).ready(function () {
  var honka = "honka";
  var ponka = "ponka";
  var output = "Info: @(ViewBag.MyArray[???][???])";
  alert(output);
}

バックスラッシュと引用符でエスケープを試みましたが、それをそのまま使用して、他のいくつかのバリアントを使用しましたが、変数がスコープ内で認識されず、閉じる括弧が見つからないなどのエラーが発生するため、構文が正しくないようです。

編集

<td>
  @(ViewBag.MyArray[a][b])
</td>

編集

また、CS ファイルと CSHTML ファイルの両方の先頭にusingキーワードを追加しました。

@{
  Layout = null;
}
@using TestService.ServiceReference;
@using System.Web.Helpers;
<!DOCTYPE html>
<html>
...
4

1 に答える 1

1

@(ViewBag.MyArray["honka"]["ponka"])式はサーバーで評価され、クライアントに送信されて JavaScript が実行される前に値に置き換えられるため、これは実行できません。

問題は、サーバーがページをレンダリングする前にこれらの変数を知る必要があることです。

回避策 1

URL のクエリ文字列を介してこれらの変数をサーバーに渡します。

かみそりの構文の例

// url : ../?var1=honka&var2=ponka
$(document).ready(function () {
  var output = 'Info: @(ViewBag.MyArray[Request["var1"]][Request["var2"])';
  alert(output);
}

回避策 2

ViewBag.MyArray 全体を Json として JavasCript 変数に割り当てます。

かみそりの構文の例

$(document).ready(function () {
  var honka = "honka";
  var ponka = "ponka";
  var myArray = @Html.Raw(Json.Encode(ViewBag.MyArray));
  var output = "Info: " + myArray[honka][ponka];
  alert(output);
}
于 2013-10-31T09:55:29.243 に答える