2015-05-28 2 views
1

В настоящее время у меня есть встроенный javascript, который делает вызов ajax контроллеру частичного просмотра, который должен был обновить вместе с ним сумку. Однако это не похоже на то, что данные, по-видимому, сохраняются с основного представления, которое является нулевым, поскольку оно никогда не было установлено и если оно было установлено, данные все равно будут сохраняться (проверяться).Viewbag не обновляется

Это мой javascript-вызов ajax.

$.ajax({ 
      url: btn.data('action-url'), 
      data: { 
       id: btn.data('id') 
      }, 
      type: 'GET', 
      success: function (data) { 
       //delete all panels before showing new ones 
       $('.panel.panel-default').remove(); 

       //push the new panels into the view 
       //$('#dash-content').html(data); 

       //Construct the partial view to be input into the main view 

       //Checks to see if browser supports templates 
       if ('content' in document.createElement('template')) { 

        var widgetModel = @Html.Raw(Json.Encode(ViewBag.widgets)); 

        for (var i = 0; i < widgetModel.length; i++) { 
         var clone = loadwidgets(widgetModel[i]); //This function is in an external js file 
         var inputDestination = document.querySelector('#col2'); 
         inputDestination.appendChild(clone); 
         console.log(inputDestination); 
        } 
       } 

и вот действие, которое оно вызывает.

public ActionResult Dashboard(int? id) 
    { 
     ModelState.Clear(); 
     //get all widgets associated dashboard 
     var getWidgetsQuery = (from widgets in db.widgets 
           where widgets.DashID == id 
           select widgets); 

     ViewBag.widgets = getWidgetsQuery.ToList(); 


     return PartialView(); 
    } 
+4

Razo r анализируется на сервере ** перед ** его отправляется в представление - '@ Html.Raw (Json.Encode (ViewBag.widgets));' генерирует начальное значение 'ViewBag.widgets' (когда страница первая загрузка) - она ​​не изменяется только потому, что вы делаете вызов ajax (проверяете источник просмотра своей страницы) –

+0

знаете ли вы, есть ли способ обойти это? – Johnathon64

+0

Вы можете вернуть Json с данными, которые вы хотите использовать. И удалите это бессмысленное 'ModelState.Clear();' :) –

ответ

2

Добавление действия для возврата данных, т.е.

public ActionResult DashboardJson(int? id) 
    { 
     //get all widgets associated dashboard 
     var getWidgetsQuery = (from widgets in db.widgets 
           where widgets.DashID == id 
           select widgets); 

     var widgets = getWidgetsQuery; 

     return Json(widgets, JsonRequestBehavior.AllowGet); 
    } 

Declare и сериализовать модель выше вызова JSon как вы сделали:

var widgetModel = @Html.Raw(Json.Encode(ViewBag.widgets)); 

Затем в течение вашего звонка успеха просто повторно -назначить его к возвращенным данным:

widgetModel = data; 
+0

Привет @hutchonoid должен менять URL-адрес действия, чтобы указать на DashboardJson? – Johnathon64

+1

@ Johnathon64 Да, таким образом, когда вы загружаете первые загрузки, вы можете использовать свои частичные. После того, как вы можете просто использовать необработанные данные, и вам остается только вернуть данные. :) – hutchonoid

+1

Это сработало отлично! Благодаря! – Johnathon64