我将以此为序,我还是JavaScript新手。问题在于更大的应用程序,我们的控制器将信息列表传递给视图,其中某些JavaScript函数依赖于某些ViewModel属性。我写了一个简单的应用程序,希望能够说明我的目标。
以下是将List传递到索引页面的示例控制器:
public ActionResult Index() {
List<int> activeIds = new List<int>();
SqlConnection sqlConn = new SqlConnection(connection_String);
sqlConn.Open();
string sqlStr = "SELECT * FROM dbo.[JS-Test] WHERE Active = 1";
SqlCommand sqlCmd = new SqlCommand(sqlStr, sqlConn);
SqlDataReader sqlDR = sqlCmd.ExecuteReader();
if(sqlDR.HasRows) {
while (sqlDR.Read()) {
activeIds.Add((int)sqlDR["ID"]);
}
}
sqlDR.Close();
sqlCmd.Dispose();
sqlConn.Close();
return View(activeIds);
}
这将返回数据库中当前的“活动”项。 (粗略)视图如下......
@model List<int>
@{
ViewBag.Title = "Index";
}
<p>Current Recognized Count: @Model.Count() </p>
<a href="#" id="printBtn">Print</a>
<script>
$(document).ready(function () {
$('#printBtn').click(function () {
var numberOfActiveIds = @Model.Count();
$.ajax({
type: "POST",
url: "/Home/PostResults",
data: { ids: numberOfActiveIds},
success: function (results) {
if(results == "Success") {
window.location.href = '/Home/Results';
}
}
});
});
});
</script>
问题是单击按钮时从数据库中获取当前活动项目数。假设用户在加载几分钟后仍然在页面上保持空闲状态。当他们的页面最初加载时,模型返回列出为活动的5个项目...但是他们一直在等待3个额外的项目在数据库中切换为活动状态共8个。但是,当用户最终点击按钮时将提交5个项目而不是当前的8个项目。
由于设置较大应用程序的性质,我无法运行查询以获取“/ Home / PostResults”ActionResult中当前活动项的数量。有没有办法在功能的其余部分使用刷新模型的值执行之前刷新页面(获取更新的模型)?
如果您有任何其他问题,请告诉我,我很乐意遵守。我已经查看了其他问题和答案,但我没有找到一个适合我的情况。谢谢!
编辑#1
所以,我已将此函数添加到Home控制器,它只返回列表计数为Json。
public ActionResult GetIds(){
List<int> activeIds = new List<int>();
SqlConnection sqlConn = new SqlConnection(connection_String);
sqlConn.Open();
string sqlStr = "SELECT * FROM dbo.[JS-Test] WHERE Active = 1";
SqlCommand sqlCmd = new SqlCommand(sqlStr, sqlConn);
SqlDataReader sqlDR = sqlCmd.ExecuteReader();
if (sqlDR.HasRows) {
while (sqlDR.Read()) {
activeIds.Add((int)sqlDR["ID"]);
}
}
sqlDR.Close();
sqlCmd.Dispose();
sqlConn.Close();
return Json(activeIds.Count());
}
视图脚本现在看起来像这样......
<script>
$(document).ready(function () {
$('#printBtn').click(function () {
var numberOfActiveIds = @Model.Count();
$.ajax({
type: "GET",
url: "/Home/GetIds",
success: function(response) {
numberOfActiveIds = response;
$.ajax({
type: "POST",
url: "/Home/PostResults",
data: { ids: numberOfActiveIds},
success: function (results) {
if(results == "Success") {
window.location.href = '/Home/Results';
}
}
});
}
});
});
});
</script>
我目前收到以下错误...
无法加载资源:服务器响应状态为500(内部服务器错误)
编辑#2
我必须将JsonRequestBehavior设置为AllowGet才能正常工作。再次感谢大家!
答案 0 :(得分:1)
gforce301提到通过ajax调用获取当前活动的一个额外的,单独的方法,使查询到数据库,然后ajax发布返回的&#34;活动&#34;。那可能吗?
是的,这是可能的。这就是我提到它的原因。无论其他人如何认为你 应该 这样做,我明白你可能会限制你为什么不能这样做 他们的方式 即使他们没有。
以下代码是您的代码重组。它将2个ajax调用链接在一起,第二个调用取决于第一个成功。注意第一个ajax调用的成功处理程序中的注释块。由于我不知道答案是什么,我无法填写有关如何使用它的部分。这实现了让用户只按一下按钮的目标。
<script>
$(document).ready(function () {
$('#printBtn').click(function () {
var numberOfActiveIds = @Model.Count();
$.ajax({
type: 'GET',
url: '/path/to/get/activeIds',
success: function(response) {
/*
Since I don't know the structure of response
I have to just explain.
use response to populate numberOfActiveIds
now we just make our post ajax request.
*/
$.ajax({
type: "POST",
url: "/Home/PostResults",
data: { ids: numberOfActiveIds},
success: function (results) {
if(results == "Success") {
window.location.href = '/Home/Results';
}
}
});
}
});
});
});
</script>
答案 1 :(得分:0)
我可以给你一个想法,我希望它可以提供帮助,
在btnclick上运行另一个ajax 1st以再次获取数据(或数据计数),如果记录计数大于当前然后更新视图并且没有PostResults,如果它相同那么只是PostResults
关于ajax成功,您可以重新加载数据或视图 并且在失败时(没有新记录时)只做PostResults