不使用QueryString传递参数

时间:2017-01-23 12:18:20

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

我有一个MVC应用程序。在一个页面上,我有一个显示引导表的局部视图。我有一些在双击表行时触发的javascript代码。此代码从双击行中检索一些值,然后构造一个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

1 个答案:

答案 0 :(得分: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