Представление не отображает обновленные значения asp.net mvc - PullRequest
0 голосов
/ 24 марта 2009

Мы хотим выполнить некоторые вычисления для некоторых значений в представлении ... поэтому, когда пользователь вводит значение во вход ... мы хотим вернуться на сервер ... выполнить вычисления и "обновить" просмотр с новыми значениями ... С таким кодом, как он есть, он вводит правильное (... или, по крайней мере, тот, о котором я его просил) действие контроллера, правильно выполняет вычисления и возвращает обновленные ViewData в представление. Когда я выполняю цикл, который создает html для представления, у ViewData есть обновленные значения, но когда представление отображается в браузере, значения не изменились ...

Вот JavaScript

$('input.changeValue').change(function() {
    $('body').css('cursor', 'wait');
    var changedAmt = this.value;
    var frmUpdate = $('form#frmUpdate').serializeArray();

    fooSoldObj = new Object();
    fooSoldObj.name = 'fooSoldAmt';
    fooSoldObj.value = changedAmt;

    frmUpdate[frmUpdate.length] = fooSoldObj;

    $.ajax(
            {
                type: $('form#frmUpdate')[0].method,
                url: $('form#frmUpdate')[0].action,
                data: frmUpdate,
                dataType: 'html',
                error: function(error) {
                    alert('frmUpdate error' + error);
                }
            }
        ); 

    setTimeout(function() {
        $('body').css('cursor', 'default');
    }, 0);
});

Вот как выглядит HTML для формы frmUpdate

<form action="/Forecast/Update" id="frmUpdate" method="post" name="frmUpdate">
    <span>
        <input id="HiddenForecastID" name="HiddenForecastID" type="hidden" value="XXX" />
        <input id="HiddenForecastYear" name="HiddenForecastYear" type="hidden" value="2009" />
        <input id="HiddenForecastMonth" name="HiddenForecastMonth" type="hidden" value="3" />       
    </span>
</form>

Теперь, чтобы еще больше сбить с толку, данные, которые отображаются неправильно, находятся в другом виде в представлении. Причина (правильная или неправильная) у меня есть две формы в том, что другая форма в представлении запускает процедуру сохранения.

Вот соответствующая часть действия контроллера

 [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Update(FormCollection frmUpdate)            
    {
        //go off and do some stuff...this part works as the ViewData 
        //is correct....meaning it has the updated values that
        //we want to see displayed in the view
        return View("MyView", ViewData[someData]);

    }

Я думаю, что, возможно, причина, по которой это не работает, заключается в том, что я обновляю одну форму, а затем прошу движок представления MVC обновить / обновить другую форму (но имейте в виду, что когда я выполняю цикл в цикле представление, которое создает страницу, данные обновляются, а страница в браузере - нет) ... Как я могу заставить представление отображать правильный HTML?

/ ********************************************
Добавлен следующий код только для проверки RedirectToAction
Вызов ajax НЕ приводит к ошибке в вышеупомянутых возвратах View ("бла")
********************************************** /

P.S. Только что попробовал RedirectToAction в контроллере, как это

 [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Update(FormCollection frmUpdate)            
    {
        //go off and do some stuff...this part works as the ViewData 
        //is correct....meaning it has the updated values that
        //we want to see displayed in the view
        return RedirectToAction("MyView", new RouteValueDictionary( new { controller = "Forecast", action = "MyView", addMonth = monthAdd } ) );
    }

но затем ошибки вызова ajax с ошибкой 500

Спасибо
Грег

Ответы [ 3 ]

3 голосов
/ 25 марта 2009

Ты почти у цели. Вот как мы это делаем.

В представлении, для раздела, который вы хотите обновить через ajax, скопируйте html отсюда в частичное представление, которое мы назовем Partial_View_of_Form, и отобразим его в представлении. Мы поместим это в уникальный div, чтобы потом заменить его ...

<div id="replace_me">
  <% Html.RenderPartial("Partial_View_of_Form", ViewData[someData]); %>
</div>

Для функции Update () вместо возврата представления верните только что созданное частичное представление с новыми значениями:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Update(FormCollection frmUpdate)
{
    // do whatever processing you need here
    return PartialView("Partial_View_of_Form", ViewData[updatedData]));
}

Наконец, в посте ajax возьмите html, который вы возвращаете из действия, и замените содержимое исходного частичного представления.

success: function(html)
{
    $("#replace_me").html(html); 
}

Это довольно грубый и непроверенный код, но отсюда его довольно легко получить

0 голосов
/ 25 марта 2009

Я получил представление для отображения обновленных данных ... это просто не ajaxy ... вот изменение, которое я внес в javascript

$('input.changeValue').change(function() {
    $('body').css('cursor', 'wait');
var changedAmt = this.value;
var frmUpdate = $('form#frmUpdate').serializeArray();

fooSoldObj = new Object();
fooSoldObj.name = 'fooSoldAmt';
fooSoldObj.value = changedAmt;

frmUpdate[frmUpdate.length] = fooSoldObj;

$.ajax(
        {
            type: $('form#frmUpdate')[0].method,
            url: $('form#frmUpdate')[0].action,
            data: frmUpdate,
            dataType: 'html',
            /* the line below is the change */
            success: function() { window.location = document.location.href; },
            error: function(error) {
                alert('frmUpdate error' + error);
            }
        }
    ); 

setTimeout(function() {
    $('body').css('cursor', 'default');
}, 0);
});

так что теперь $ .ajax отправляет данные frmUpdate на сервер ... сервер вносит некоторые изменения в данные в объекте Session ... сохраняет сохраненные данные в объекте Session ... и затем представление загружается через

window.location = document.location.href

строка, которая запускает действие контроллера

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult MyView(int monthAdd) 

, который затем просматривает объект Session, получает только что измененные данные и возвращает представление ... кажется, что я обхожу свой локоть, чтобы добраться до моего $$:)

0 голосов
/ 24 марта 2009

У вас есть 2 отдельные среды здесь. Ваш код MVC работает на сервере, а ваш JavaScript работает на клиенте (браузере). Когда вы отправляете вашу форму, браузер отправляет запрос обратно на сервер, а ваш контроллер обрабатывает ее и предоставляет данные для представления, которое будет отображаться. Представление, которое отображается, отправляется обратно в браузер, который должен его интерпретировать.

Код ответа 500 означает «Ошибка сервера». Другими словами, сервер сталкивается с некоторой проблемой, прежде чем он отправит ответ в браузер. Попробуйте изучить сведения об ошибке, которые предоставляются, когда вы видите ошибку. Это должно дать вам некоторое представление о том, что происходит не так. Вероятно, в представлении, которое вы отображаете, есть только одна ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...