javascript - ASP.NET MVC/JQuery/Javascript:搜索(并尝试加载)新数据后, View 不会刷新

标签 javascript jquery asp.net-mvc-4 view

这是我关于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操作的HttpGetHttpPost变体。 (HttpPost操作完全为空,除了返回视图外。这解释了为什么页面无法加载和显示任何内容的原因,更不用说我下一个案例搜索的结果了。)
一旦我纠正了这些问题(并调整了一些其他按钮,使它们在我提交文档时不自动发布或尝试运行),代码终于可以工作了!赞美神。无需费解或怪异的路径即可返回到控制器-之后事情就很快发生了。


(现在要修剪一堆脚手架和其他不必要的代码...)

关于javascript - ASP.NET MVC/JQuery/Javascript:搜索(并尝试加载)新数据后, View 不会刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28051414/

相关文章:

javascript - 使用 JavaScript 确定平板电脑上的触摸位置

javascript - 首次单击当前编辑行中的组合框时,Ext 4 RowEditor 编辑取消

javascript - 我想从 jQuery.click() 方法传递参数

c# - 使用下拉列表时的 Asp.net mvc ModelState 有效性

javascript - 无法访问另一个javascript文件中的变量

javascript - 尝试将事件处理程序放入单独文件时出现 Discord.js "cannot read properties of undefined"

javascript - Safari:焦点事件不适用于按钮元素

javascript - JQuery 选择器无法从外部 js 文件运行

asp.net - Application_Error 未在 asp.net web api 中触发

c# - 从命令行运行时,NUnit 看不到 configSource 定义的连接字符串