【问题标题】:Pass parameters without using QueryString不使用 QueryString 传递参数
【发布时间】:2017-01-23 12:18:20
【问题描述】:

我有一个 MVC 应用程序。在一个页面上,我有一个显示引导表的局部视图。我有一些在双击表格行时触发的 javascript 代码。此代码从双击的行中检索一些值并构造一个 url,然后导航到该 url。

这很好用,但我创建 url 的方式意味着我在 url 中有数据作为查询字符串可见。如何在不使用查询字符串的情况下实现导航。哦,如果可能的话,我需要导航到新窗口/标签。

我的双击javascript代码是:

$mTable.on('dbl-click-row.bs.table', function (e, row, $element) {

        var cod = $('#hdCOD').val();
        var mv = mGetSelectedRow().CMonth;
        var yv = mGetSelectedRow().CYear;

        var diff_cv = moment.utc(cod).diff(moment.utc(yv + '-' + pad(mv, 2) + '-' + '24'), 'months', true);
        var plcf = '';

        switch(true) {
            case (diff_cv >= 2):
                plcf = 'past';
                break;
            case (diff_cv >= 1 && diff_cv < 2):
                plcf = 'last';              
                break;
            case (diff_cv >= 0 && diff_cv < 1):
                plcf = 'current';
                break;
            case (diff_cv < 0):
                plcf = 'future';
        }

        var url = 'ClaimMonth/ViewMonth?pn=' + mGetSelectedRow().Cpid + '&cm=' + mv + '&cy=' + yv + '&mt=' + plcf + '&cod=' + cod;
        window.open(url, '_blank');
    })

使用剃刀语法调用局部视图:

Html.RenderAction("GetSummaryForAdmin", New With {Key .pn = Model.PersonelNo})

我似乎无法在 javaScript 中找到模拟 New With {Key .pn = Model.PersonelNo} 的等效函数我也不确定这是否是这样做的方法。我考虑过 ajax 调用,但我认为我不能将其作为新窗口/标签打开。

任何帮助表示赞赏。

更新

我找到了以下 ajax.post 方法,它为我提供了我想要的文档...在开发人员工具(Chrome/IE 中的 F12)中,使用网络选项卡我可以看到对文档的调用,如果我预览它,它显示数据。但是页面没有显示在浏览器中。

在新窗口/选项卡中打开不是必需的,但最好有。

我的新代码替换...

        //var url = 'ClaimMonth/ViewMonth?pn=' + mGetSelectedRow().Cpid + '&cm=' + mv + '&cy=' + yv + '&mt=' + plcf + '&cod=' + cod;
        //window.open(url, '_blank');

与...

        $.ajax({
            type : "post",
            url : "ClaimMonth/ViewMonth",            
            data :  {pn: mGetSelectedRow().Cpid, cm: mv, cy: yv, mt: plcf, cod: cod },            
            success : function(response) {
                window.open();
            },
            error : function(xhr) {
                console.log("error"+xhr.status);
            },
            complete : function() {
            }
        });

我将控制器函数更改为接受参数而不是读取 request.querystring

【问题讨论】:

  • 如果你想用参数导航,那么你几乎必须使用查询字符串。在页面之间移动和传输数据的唯一其他方法是使用带有 POST 的表单提交。然后我不确定您是否可以在单独的选项卡中打开结果。但是当然,即使这样,好奇的用户也可以通过观察网络(通过浏览器工具或任何其他适当的软件)轻松查看在 POST 中传递了哪些参数。为什么要隐藏这些数据?看起来您试图隐藏的所有值都在页面上的某个地方可用
  • @ADyson 正确......这些值不敏感......但客户更喜欢干净整洁的 URL。我遇到了一些使用 Post 的代码,它可以工作但不显示结果。查看我的更新
  • window.open(); 只是打开一个没有内容的空白窗口。对您的客户进行有趣的观察,我从来没有遇到任何用户/客户甚至注意到他们的 URL 栏中的内容(在某些情况下,他们没有注意到他们是否在测试系统或活一个),不管它看起来是否整洁。
  • 但实际上大多数网站都没有简洁的 URL,尤其是涉及搜索的内容,或带有产品链接的商业网站。甚至谷歌也没有:google.co.uk/…。 TBH 我认为你无缘无故地让你的代码(和你的生活!)变得复杂。只需告诉客户这就是网络的运作方式,因此他们只需要接受它即可。如果软件有效,他们很快就会忘记。

标签: javascript asp.net-mvc vb.net bootstrap-table


【解决方案1】:

您必须同时使用回发和Session

  • AJAX Post(正如您已经完成的那样)将值发送回服务器。

  • 在处理该回发的 MVC 操作方法中,将值保存到 Session:

    Public Function ViewMonth(...) As JsonResult
        Session("SavedMonth") = New MonthObj(pn, cm, cy, mt, cod)
    
        Return Json(True)
    End Function
    
  • 当 AJAX Post 成功返回时,使用不同的 URL 打开一个新窗口:

     success : function(response) {
            window.open('/ClaimMonth/AfterSave');
        },
    
  • 该 URL 的 MVC 操作方法从会话加载保存的数据,然后显示它。

    Public Function AfterSave() As ViewResult
        Dim model As MonthObj = TryCast(Session("SavedMonth"), ModelObj)
    
        Return View(model)
    End Function
    

【讨论】:

  • 谢谢 buffjape... 这行得通。我不认为有办法在新窗口/标签中打开它吗?如果没有人对改进此解决方案有任何建议,我将在一天结束时将其标记为答案,以便在新窗口/标签中打开页面。
猜你喜欢
  • 2010-11-29
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
相关资源
最近更新 更多