ASP.NET MVC / JQuery/ Javascript:搜索(并尝试加载)新数据后视图不会刷新
ASP.NET MVC / JQuery/ Javascript: view will not refresh after searching (and trying to load) new data
这是我的第一个 post Whosebug。在过去的一个月里,我一直在尝试自己解决这个问题,广泛搜索 Google 和这个网站。这是我的问题:
我有一个用户可以搜索案例的网站。当他们找到案例时,他们的结果会加载到案例详细信息页面上。用户通常通过单击搜索选项从主页搜索案例,他们在其中输入案例编号,如下所示:
14-12345
用户将他们的搜索提交给主页的索引控制器。控制器解析搜索并重定向到 "case" 操作。此操作轮询数据库以获取案例详细信息,并且 return 是案例视图。
此搜索有效 - 用户可以在个案详细信息页面上看到他们的搜索结果。但是,已收到请求,因此用户也可以从案例详细信息页面搜索案例。
我无法使新请求生效。我试过使用 Web API(这真的是浪费时间,因为我想 return 整个视图,而不仅仅是搜索数据),但我未能创建合适的 controller/view 组合来处理我的数据。我通常会尝试使用现有的控制器(具有要搜索的代码)和案例详细信息视图。
分解碎片...
模型数据存储在viewmodel
文件中:
public class PortalCaseView
{
public DocketCase CaseInfo { get; set; }
public List<CaseNote> Notes { get; set; }
public string Search { get; set; }
...other various variable declarations, etc
}
Index.cshtml 文件是站点的 homepage/main 登录页面。用户可以通过转到搜索部分来搜索案例详细信息(代码来自此处的视图):
<div class="tile">
<span>Search by Case Number</span>
@Html.EditorFor(x => x.Search)
<a class="m-btn green-stripe" href="javascript:submitForm();" style="color: #444;
text-decoration: none;">Submit<i class="icon-hdd"></i></a> <a class="m-btn red-stripe"
href="javascript:toggleSearch();" style="color: #444; text-decoration: none;">Cancel<i
class="icon-remove"></i></a>
</div>
(提交结果给一个提交命令,post将搜索交给controller。)
PortalController.cs 控制器文件引导对主页的请求。它的 Index
方法获取 Search 变量,并重定向到 Case 操作来处理:
索引
if (!string.IsNullOrWhiteSpace(viewmodel.Search))
{
...
return RedirectToAction("Case", new { Year = docketnumber[0], Sequence = docketnumber[1], J = viewmodel.JudgeCode });
}
案例
[HttpGet]
public ActionResult Case(int Year, int Sequence, string J)
{
...various declarations and requests to get db information...
return View(vm); //vm is a viewmodel with info for the case view
}
[HttpPost]
public ActionResult Case(PortalCaseView vm)
{
return View(vm);
}
* 当重定向到 Case 操作完成时,Case.cshtml 视图会加载必要的详细信息。现在需要从案例视图进行搜索,我在案例视图中添加了一个部分以进行 "on-demand" 搜索查询:
<textarea id="searchForCase" style="width: 150px;"></textarea>
<a class="m-btn green-stripe" href="javascript:searchCase();" style="color: #444;
text-decoration: none;">Search<i class="icon-hdd"></i></a>
- 这就是问题开始的地方。在典型的 运行 期间,Ajax/JSON 代码构建对控制器操作的回调。然后,操作执行(通常针对存储在文件或文件夹中的数据)。 return 编辑了一个视图,然后刷新了页面。 (这是用户使用该网站时的情况。)我的新自定义代码的工作方式不同。
我的自定义 searchCase() 函数使用用户输入的案例编号来搜索它(它返回到原始 [ 中的索引操作) =156=] 文件):
var searchCase = function () {
var textArea = document.getElementById("searchForCase");
var txt = String(textArea.value);
jQuery.ajax({
type: "POST",
url: "@Url.Action("Index","Portal")",
dataType: "json",
contentType: "application/json; charset=utf-8",
data: JSON.stringify({ fromCaseSearch: txt }),
success: function (data) {
alert(data);
},
failure: function (errMsg) {
alert(errMsg);
}
});
$('form').submit();
}
(注意:我已经尝试将数据类型从 json 更改为 html;我假设我可能需要使用内容类型)
我已经追踪了从这一点开始的进展。该网站返回到 PortalController.cs 和 Index 操作(跟进 POST),然后接受用户提供的搜索查询。因为当我像以前一样尝试重定向到 Case 操作时它不在 Index 操作中,所以我添加了一个 if
语句来直接从案例详细信息视图处理搜索查询:
if (!string.IsNullOrEmpty(fromCaseSearch))
{
System.Web.HttpContext.Current.Session.Clear();
//forget why I put that clear request there, but I do
//use session state variables, so I might need to clear
//them when searching from scratch - if they exist
viewmodel = new PortalIndexView();
viewmodel.Search = fromCaseSearch;
...initialization and parsing for search...
...searching for and loading data from database(s)...
ModelState.Clear(); //was hoping this would "refresh" view
//...this didn't work either
return View("Case", vm); //forced website to return
//case view with viewmodel data
//...this actually starts loading
//the case view
}
这确实有效……在一定程度上。数据以相同的方式处理,案例视图像正常一样加载。但是,即使跟踪加载过程(并看到模型变量已发送到视图),页面也不会更新新信息。
所以,这就是我被困的地方。我试过调整一些设置(甚至认为问题可能出在 web.config 文件中),但是当我 运行 遇到这样的问题时,通常解决问题的方法是找出什么我在这里做错了(或在问题的大致范围内 - 当我首先修复简单的东西时通常会得到答案)。
最后一分钟的事情:
PortalController.cs(控制器)输出到Case.cshtml(案例详情视图)。右键单击 View controller 操作时,它会重定向回 PortalController.cs(登录页面的主控制器)。
无其他控制人共享Case.cshtml。
没有CaseController.cs文件。看起来我的前任只是简单地创建了搜索 "redirect",认为用户只会从主页搜索(他们直到现在才这样做)。
最后一秒的想法?也许我也应该为我的新代码考虑 HTTPGet 和 HTTPPost 操作。不确定...脑子糊了...
当然,由于这是一个工作项目,我只能提供这么多细节,但我很乐意在这一点上提出建议。
更新:我的问题是否可能是因为我没有在案例详细信息视图中包含 @using (Html.BeginForm(...))
行?我注意到没有一个。您需要 一个能够在相关控制器中执行官方 POST 操作的吗?
另一个说明:我正在使用 Ajax/JSON 将数据从案例视图传回控制器,因为我无法将页面转到 "submit"(在 Javascript/JQuery 代码,$('form').submit()
根本不起作用)。我想知道它是否与 Web API 有任何关系。 (有一个名为 CaseNoteController.cs 的 Web API 文件处理添加到案例中的注释。当我尝试使用 Web API -并且可能 return 使用它的视图 - 我有一个测试 api 调用使案例详细信息视图页面刷新毫不费力;我只是不知道如何让它满足我的需要。)
问题已解决(我的错)。我缺乏经验使我无法早点弄清楚这一点:
我最终不需要案例视图中的 searchCase
函数。原因:我没有将我的 Case 视图包装在 @using(Html.BeginForm())
代码块中,这意味着我的页面没有 post 结果(无论我有多努力)
我没有关注我的PortalController.cs文件,里面已经有[=我的 Case 操作的 12=] 和 HttpPost
变体。 (HttpPost
操作完全是空的,除了返回视图。这解释了为什么页面无法加载和显示任何内容,更不用说我下一个案例搜索的结果了。)
一旦我纠正了这些问题(并调整了一些其他按钮,使它们在我提交文档时不会自动 post 或尝试 运行),代码终于成功了!赞美神。不需要复杂或奇怪的路径返回控制器 - 之后事情发生得很快。
(现在 trim 关闭一大堆脚手架和其他不必要的代码...)
这是我的第一个 post Whosebug。在过去的一个月里,我一直在尝试自己解决这个问题,广泛搜索 Google 和这个网站。这是我的问题:
我有一个用户可以搜索案例的网站。当他们找到案例时,他们的结果会加载到案例详细信息页面上。用户通常通过单击搜索选项从主页搜索案例,他们在其中输入案例编号,如下所示:
14-12345
用户将他们的搜索提交给主页的索引控制器。控制器解析搜索并重定向到 "case" 操作。此操作轮询数据库以获取案例详细信息,并且 return 是案例视图。
此搜索有效 - 用户可以在个案详细信息页面上看到他们的搜索结果。但是,已收到请求,因此用户也可以从案例详细信息页面搜索案例。
我无法使新请求生效。我试过使用 Web API(这真的是浪费时间,因为我想 return 整个视图,而不仅仅是搜索数据),但我未能创建合适的 controller/view 组合来处理我的数据。我通常会尝试使用现有的控制器(具有要搜索的代码)和案例详细信息视图。
分解碎片...
模型数据存储在
viewmodel
文件中:public class PortalCaseView { public DocketCase CaseInfo { get; set; } public List<CaseNote> Notes { get; set; } public string Search { get; set; } ...other various variable declarations, etc }
Index.cshtml 文件是站点的 homepage/main 登录页面。用户可以通过转到搜索部分来搜索案例详细信息(代码来自此处的视图):
<div class="tile"> <span>Search by Case Number</span> @Html.EditorFor(x => x.Search) <a class="m-btn green-stripe" href="javascript:submitForm();" style="color: #444; text-decoration: none;">Submit<i class="icon-hdd"></i></a> <a class="m-btn red-stripe" href="javascript:toggleSearch();" style="color: #444; text-decoration: none;">Cancel<i class="icon-remove"></i></a> </div>
(提交结果给一个提交命令,post将搜索交给controller。)
PortalController.cs 控制器文件引导对主页的请求。它的
Index
方法获取 Search 变量,并重定向到 Case 操作来处理:
索引
if (!string.IsNullOrWhiteSpace(viewmodel.Search))
{
...
return RedirectToAction("Case", new { Year = docketnumber[0], Sequence = docketnumber[1], J = viewmodel.JudgeCode });
}
案例
[HttpGet]
public ActionResult Case(int Year, int Sequence, string J)
{
...various declarations and requests to get db information...
return View(vm); //vm is a viewmodel with info for the case view
}
[HttpPost]
public ActionResult Case(PortalCaseView vm)
{
return View(vm);
}
* 当重定向到 Case 操作完成时,Case.cshtml 视图会加载必要的详细信息。现在需要从案例视图进行搜索,我在案例视图中添加了一个部分以进行 "on-demand" 搜索查询:
<textarea id="searchForCase" style="width: 150px;"></textarea>
<a class="m-btn green-stripe" href="javascript:searchCase();" style="color: #444;
text-decoration: none;">Search<i class="icon-hdd"></i></a>
- 这就是问题开始的地方。在典型的 运行 期间,Ajax/JSON 代码构建对控制器操作的回调。然后,操作执行(通常针对存储在文件或文件夹中的数据)。 return 编辑了一个视图,然后刷新了页面。 (这是用户使用该网站时的情况。)我的新自定义代码的工作方式不同。
我的自定义 searchCase() 函数使用用户输入的案例编号来搜索它(它返回到原始 [ 中的索引操作) =156=] 文件):
var searchCase = function () {
var textArea = document.getElementById("searchForCase");
var txt = String(textArea.value);
jQuery.ajax({
type: "POST",
url: "@Url.Action("Index","Portal")",
dataType: "json",
contentType: "application/json; charset=utf-8",
data: JSON.stringify({ fromCaseSearch: txt }),
success: function (data) {
alert(data);
},
failure: function (errMsg) {
alert(errMsg);
}
});
$('form').submit();
}
(注意:我已经尝试将数据类型从 json 更改为 html;我假设我可能需要使用内容类型)
我已经追踪了从这一点开始的进展。该网站返回到 PortalController.cs 和 Index 操作(跟进 POST),然后接受用户提供的搜索查询。因为当我像以前一样尝试重定向到 Case 操作时它不在 Index 操作中,所以我添加了一个
if
语句来直接从案例详细信息视图处理搜索查询:if (!string.IsNullOrEmpty(fromCaseSearch)) { System.Web.HttpContext.Current.Session.Clear(); //forget why I put that clear request there, but I do //use session state variables, so I might need to clear //them when searching from scratch - if they exist viewmodel = new PortalIndexView(); viewmodel.Search = fromCaseSearch; ...initialization and parsing for search... ...searching for and loading data from database(s)... ModelState.Clear(); //was hoping this would "refresh" view //...this didn't work either return View("Case", vm); //forced website to return //case view with viewmodel data //...this actually starts loading //the case view }
这确实有效……在一定程度上。数据以相同的方式处理,案例视图像正常一样加载。但是,即使跟踪加载过程(并看到模型变量已发送到视图),页面也不会更新新信息。
所以,这就是我被困的地方。我试过调整一些设置(甚至认为问题可能出在 web.config 文件中),但是当我 运行 遇到这样的问题时,通常解决问题的方法是找出什么我在这里做错了(或在问题的大致范围内 - 当我首先修复简单的东西时通常会得到答案)。
最后一分钟的事情:
PortalController.cs(控制器)输出到Case.cshtml(案例详情视图)。右键单击 View controller 操作时,它会重定向回 PortalController.cs(登录页面的主控制器)。
无其他控制人共享Case.cshtml。
没有CaseController.cs文件。看起来我的前任只是简单地创建了搜索 "redirect",认为用户只会从主页搜索(他们直到现在才这样做)。
最后一秒的想法?也许我也应该为我的新代码考虑 HTTPGet 和 HTTPPost 操作。不确定...脑子糊了...
当然,由于这是一个工作项目,我只能提供这么多细节,但我很乐意在这一点上提出建议。
更新:我的问题是否可能是因为我没有在案例详细信息视图中包含 @using (Html.BeginForm(...))
行?我注意到没有一个。您需要 一个能够在相关控制器中执行官方 POST 操作的吗?
另一个说明:我正在使用 Ajax/JSON 将数据从案例视图传回控制器,因为我无法将页面转到 "submit"(在 Javascript/JQuery 代码,$('form').submit()
根本不起作用)。我想知道它是否与 Web API 有任何关系。 (有一个名为 CaseNoteController.cs 的 Web API 文件处理添加到案例中的注释。当我尝试使用 Web API -并且可能 return 使用它的视图 - 我有一个测试 api 调用使案例详细信息视图页面刷新毫不费力;我只是不知道如何让它满足我的需要。)
问题已解决(我的错)。我缺乏经验使我无法早点弄清楚这一点:
我最终不需要案例视图中的
searchCase
函数。原因:我没有将我的 Case 视图包装在@using(Html.BeginForm())
代码块中,这意味着我的页面没有 post 结果(无论我有多努力)我没有关注我的PortalController.cs文件,里面已经有[=我的 Case 操作的 12=] 和
HttpPost
变体。 (HttpPost
操作完全是空的,除了返回视图。这解释了为什么页面无法加载和显示任何内容,更不用说我下一个案例搜索的结果了。)一旦我纠正了这些问题(并调整了一些其他按钮,使它们在我提交文档时不会自动 post 或尝试 运行),代码终于成功了!赞美神。不需要复杂或奇怪的路径返回控制器 - 之后事情发生得很快。
(现在 trim 关闭一大堆脚手架和其他不必要的代码...)