Razor MVC JavaScript配列にモデル配列を追加する


99

モデルの配列を含むJavaScript配列をロードしようとしています。これは可能であるように思えます。

以下の方法はどちらも機能しません。

JavaScriptループを作成して、JavaScript変数を含むモデル配列を介してインクリメントすることはできません

for(var j=0; j<255; j++)
{
    jsArray = (@(Model.data[j])));
}

Razorループを作成できません。JavaScriptはスコープ外です

@foreach(var d in Model.data)
{
    jsArray = d;
}

私はそれを動作させることができます

var jsdata = @Html.Raw(Json.Encode(Model.data)); 

しかし、なぜJSONを使用する必要があるのか​​わかりません。

また、現時点では、これを255バイトに制限しています。将来的には、多くのMBに実行される可能性があります。


1
あなたはjsでかみそりにアクセスできますが、その逆はできません
Ehsan Sajjad 2014年

回答:


215

これは可能です、かみそりコレクションをループするだけです

<script type="text/javascript">

    var myArray = [];

    @foreach (var d in Model.data)
    {
        @:myArray.push("@d");
    }

    alert(myArray);

</script>

お役に立てれば


ただし、次の表記を使用して配列を宣言する必要がありました。var myArray = new Array();
トムマーティン

正常に動作します-はい、そうでない場合はmyArrayというC#オブジェクトを探します。
heymega 2014年

1
大きな助け。モデルディクショナリからJavaScriptオブジェクトを構築する際に、いくつかの大きな問題が発生すると思いました。
IAbstract 2015

ありがとうございました!文字
列の

@ mmcrae、@dforeachループ内で宣言されています。dの前にVARという用語があることに注意してください。これにより 、foreachループで使用できるようになります
JhWebDev '

8

JSON構文は、オブジェクトをコーディングするためのJavaScript構文とほぼ同じです。したがって、簡潔さと速度の点で、あなた自身の答えが最善の策です。

私のドロップダウンリストをKnockoutJSモデルに追加するときに、このアプローチを使用します。例えば

var desktopGrpViewModel = {
    availableComputeOfferings: ko.observableArray(@Html.Raw(JsonConvert.SerializeObject(ViewBag.ComputeOfferings))),
    desktopGrpComputeOfferingSelected: ko.observable(),
};
ko.applyBindings(desktopGrpViewModel);

...

<select name="ComputeOffering" class="form-control valid" id="ComputeOffering" data-val="true" 
data-bind="options: availableComputeOffering,
           optionsText: 'Name',
           optionsValue: 'Id',
           value: desktopGrpComputeOfferingSelect,
           optionsCaption: 'Choose...'">
</select>

シリアル化にはJson.NET NuGetパッケージを使用し、データを渡すにはViewBagを使用していることに注意してください。


6

私はList<Alert>C#からのトースト(アラートメッセージ)のリストを操作していて、部分的なビュー(.cshtmlファイル)でToastrの JavaScript配列として必要でした。以下のJavaScriptコードは私にとってうまくいきました:

var toasts = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(alerts));
toasts.forEach(function (entry) {
    var command = entry.AlertStyle;
    var message = entry.Message;
    if (command === "danger") { command = "error"; }
    toastr[command](message);
});

4

私はスライダーを統合していて、フォルダー内のすべてのファイルを取得する必要があり、C#配列からJavaScript配列への同じ状況が発生varしましたforeach。だから私はループを回避するために少し仕事をしました。

var allowedExtensions = new string[] { ".jpg", ".jpeg", ".bmp", ".png", ".gif" };

var bannerImages = string.Join(",", Directory.GetFiles(Path.Combine(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath, "Images", "banners"), "*.*", SearchOption.TopDirectoryOnly)
    .Where(d => allowedExtensions.Contains(Path.GetExtension(d).ToLower()))
    .Select(d => string.Format("'{0}'", Path.GetFileName(d)))
    .ToArray());

そしてJavaScriptコードは

var imagesArray = new Array(@Html.Raw(bannerImages));

それが役に立てば幸い


4

より複雑な項目を配列に追加する場合は、参考のために、上位投票の回答を展開します。

@:myArray.push(ClassMember1: "@d.ClassMember1", ClassMember2: "@d.ClassMember2");

さらに、配列をパラメーターとしてコントローラーに渡したい場合は、最初に文字列化できます。

myArray = JSON.stringify({ 'myArray': myArray });


コードに問題があります。それはする必要があります @:myArray.push(ClassMember1: "@d.ClassMember1", ClassMember2: "@d.ClassMember2");
アサド

1

私が実装したので、これはより良いアプローチです:)

@model ObjectUser
@using System.Web.Script.Serialization
@{ 
    var javaScriptSearilizer = new JavaScriptSerializer();
    var searializedObject = javaScriptSearilizer.Serialize(Model);
 }

<script>
    var searializedObject = @Html.Raw(searializedObject )
    console.log(searializedObject);
    alert(searializedObject);
</script>

これがモデルの反復を防ぐのに役立つことを願っています(ハッピーコーディング)


0

対称(長方形)配列の場合は、1次元のJavaScript配列にプッシュしてみてください。かみそりを使用して配列構造を決定します。次に、2次元配列に変換します。

// this just sticks them all in a one dimension array of rows * cols
var myArray = new Array();
@foreach (var d in Model.ResultArray)
{
    @:myArray.push("@d");
}

var MyA = new Array();

var rows = @Model.ResultArray.GetLength(0);
var cols = @Model.ResultArray.GetLength(1);

// now convert the single dimension array to 2 dimensions
var NewRow;
var myArrayPointer = 0;

for (rr = 0; rr < rows; rr++)
{
  NewRow = new Array();
  for ( cc = 0; cc < cols; cc++)
  {
    NewRow.push(myArray[myArrayPointer]);
    myArrayPointer++;
  }
  MyA.push(NewRow);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.