View不显示更新的值asp.net mvc

时间:2009-03-24 15:39:27

标签: asp.net-mvc jquery

我们想对视图中的某些值执行一些计算...所以当用户在输入中输入一个值时...我们想要回到服务器...执行计算并“刷新”使用新值查看...使用现在的代码,它输入正确的(...或至少我要求的)控制器操作,正确执行计算并将更新的ViewData返回到视图。当我逐步通过为视图构建html的循环时,ViewData具有更新的值,但是当浏览器上显示View时,值没有改变...

这是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);
});

这就是frmUpdate形式的html看起来像

<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(“blah”)东西上没有错误 ********************************************** / / / p >

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 个答案:

答案 0 :(得分:3)

你快到了。这就是我们这样做的方式。

在视图中,对于要通过ajax更新的部分,将html从此处复制到部分视图,我们将调用Partial_View_of_Form并在视图上呈现它。我们将其置于一个独特的div中,以便我们稍后可以替换此内容...

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

对于Update()而不是返回View,返回我们刚刚使用新值创建的局部视图:

[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); 
}

这是非常粗略的代码,未经测试,但从这里开始应该很容易

答案 1 :(得分:0)

这里有2个不同的环境。您的MVC代码在服务器上运行,您的javascript在客户端(浏览器)上运行。当您提交表单时,浏览器会将请求发送回服务器,并且您的控制器会处理它并将其处理。为要渲染的视图提供数据。呈现的视图将发送回浏览器,浏览器必须对其进行解释。

500响应代码表示“服务器错误”。换句话说,服务器在将响应发送到浏览器之前遇到了一些问题。尝试检查看到错误时提供的错误详细信息。它应该给你一些关于出了什么问题的线索。你正在渲染的视图中可能只是一个错误。

答案 2 :(得分:0)

我得到了显示更新数据的视图...它只是不是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对象中查找,获取刚刚更改的数据并返回视图...好像我正在绕着我的肘部去找我的a $$:)