这是我关于stackoverflow的第一篇文章。我花了一个月的时间独自尝试解决此问题,并广泛搜索Google和该网站。这是我的问题:
我有一个网站,用户可以在其中搜索案例。当他们找到案件时,其结果将加载到案件详细信息页面上。用户通常通过单击搜索选项从主页上搜索案例,然后在其中输入案例编号,如下所示:14-12345
用户将搜索结果提交到首页的索引控制器。控制器解析搜索并重定向到“ case”操作。此操作将轮询数据库以获取案例详细信息,并返回案例视图。
此搜索有效-用户在案例详细信息页面上查看搜索结果。但是,已收到请求,因此用户也可以从“案例详细信息”页面搜索案例。
我无法使新请求生效。我尝试使用Web API(这实际上是在浪费时间,因为我想返回整个视图,而不仅仅是搜索数据),但是我未能创建合适的控制器/视图组合来处理我的数据。我通常会尝试使用现有的控制器(具有要搜索的代码)和案例详细信息视图。
分解碎片...
模型数据存储在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文件是站点的主页/主要目标页面。用户可以通过转到要搜索的部分来搜索案例详细信息(来自此处视图的代码):
<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>
(提交结果将给出一个Submit命令,该命令会将搜索结果发布到控制器。)
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视图将加载必要的详细信息。现在需要从案例视图中进行搜索,我已经在案例视图中添加了一个部分以接受“按需”搜索查询:
<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代码会建立对控制器动作的回调。然后,执行该操作(通常对存储在文件或文件夹中的数据执行)。返回一个视图,然后页面刷新。 (这是用户使用网站时的情况。)对于我的新自定义代码,它的工作方式不同。
我的自定义searchCase()函数采用用户输入的案例编号来搜索它(它返回到原始PortalController.cs文件中的Index操作):
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
语句直接从case详细信息视图处理搜索查询: 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(案例详细信息视图)。右键单击“视图控制器”操作时,它将重定向回到PortalController.cs(登录页面的主控制器)。
没有其他控制器共享Case.cshtml。
没有CaseController.cs文件。看来我的前任只是简单地创建了搜索“重定向”,以为用户只能从首页进行搜索(直到现在为止)。
最后一个想法?也许我也应该为新代码考虑HTTPGet和HTTPPost操作。不确定...大脑软糊...
自然,由于这是一个工作项目,因此我只能提供很多细节,但是现在我很乐意提出建议。
更新:我的问题是否可能是因为我的案例详细信息视图中没有包含
@using (Html.BeginForm(...))
行?我注意到没有人。您是否需要一个人才能在相关控制器中执行正式的POST操作?另一说明:我使用Ajax / JSON将数据从案例视图传递回控制器,因为我无法使页面仅“提交”(在Javascript / JQuery代码中,
$('form').submit()
在所有)。我想知道它是否与Web API有关。 (有一个名为CaseNoteController.cs的Web API文件,用于处理添加到案例中的注释。当我尝试使用Web API时-可能使用它返回一个视图-我进行了一个测试api调用,使案例详细信息视图页面轻松刷新;我只是想不出如何让它满足我的需求。)
最佳答案
问题解决了(我的错)。由于缺乏经验,我无法尽早解决这个问题:
我结束了在案例视图中不需要searchCase
函数的工作。原因:我没有将Case视图包装在@using(Html.BeginForm())
代码块中,这意味着我的页面没有发布结果(无论我如何努力)
我没有注意我的PortalController.cs文件,该文件已经具有Case操作的HttpGet
和HttpPost
变体。 (HttpPost
操作完全为空,除了返回视图外。这解释了为什么页面无法加载和显示任何内容的原因,更不用说我下一个案例搜索的结果了。)
一旦我纠正了这些问题(并调整了一些其他按钮,使它们在我提交文档时不自动发布或尝试运行),代码终于可以工作了!赞美神。无需费解或怪异的路径即可返回到控制器-之后事情就很快发生了。
(现在要修剪一堆脚手架和其他不必要的代码...)
关于javascript - ASP.NET MVC/JQuery/Javascript:搜索(并尝试加载)新数据后, View 不会刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28051414/