我们想对视图中的某些值执行一些计算...所以当用户在输入中输入一个值时...我们想要回到服务器...执行计算并“刷新”使用新值查看...使用现在的代码,它输入正确的(...或至少我要求的)控制器操作,正确执行计算并将更新的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错误
谢谢,
格雷格
答案 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 $$:)