ASP.NET MVC - 输入值更改更新 URL 参数

Posted

技术标签:

【中文标题】ASP.NET MVC - 输入值更改更新 URL 参数【英文标题】:ASP.NET MVC - On Input Value Change Update URL Parmaeters 【发布时间】:2017-05-08 20:23:12 【问题描述】:

我有一个地图应用程序,我想将范围值放在 URL 中。 (XMIN、YMIN、XMAX、YMAX)。我目前有一个处理所有映射相关功能的 javascript 文件。当范围发生变化时,此脚本还会创建并使用适当的值更新隐藏的输入。我想要一个 JQUERY 事件侦听器,然后从视图内部处理适当的 url 操作。

我正在使用 dojo 创建隐藏输入。这是有效的,并且会适当地更新值。

    domConstruct.place("<input type='hidden' id='xmin-h'/>", "av-map-div");
    domConstruct.place("<input type='hidden' id='ymin-h'/>", "av-map-div");
    domConstruct.place("<input type='hidden' id='xmax-h'/>", "av-map-div");
    domConstruct.place("<input type='hidden' id='ymax-h'/>", "av-map-div");
    domConstruct.place("<input type='hidden' id='wkid-h'/>", "av-map-div");

然后在范围变化...

    map.on("extent-change", function () 
        var jextent = getExtentParm();
        console.log(jextent);
    );

调用...

var getExtentParm = function getExtentParm() 
    console.log("get extent");

    var XMIN;
    var YMIN;
    var XMAX;
    var YMAX;
    var WKID;

    XMIN = map.extent.xmin;
    YMIN = map.extent.ymin;
    XMAX = map.extent.xmax;
    YMAX = map.extent.ymax;
    WKID = map.extent.spatialReference.latestWkid;

    var hXmin = document.getElementById("xmin-h");
    domAttr.set(hXmin, "value", XMIN);

    var hYmin = document.getElementById("ymin-h");
    domAttr.set(hYmin, "value", YMIN);

    var hXmax = document.getElementById("xmax-h");
    domAttr.set(hXmax, "value", XMAX);

    var hYmax = document.getElementById("ymax-h");
    domAttr.set(hYmax, "value", YMAX);

    var hWkid = document.getElementById("wkid-h");
    domAttr.set(hWkis, "value", WKID);



在我看来,然后我想操作 URL 查询字符串。贝娄是我最近的尝试。它失败。

@section scripts 
<script src="https://js.arcgis.com/3.20/"></script>
<script src="~/Scripts/av-map.js"></script>  

<script>
    $(document).ready(function () 

        var currentUrl = window.location.href;
        var parsedUrl = $.url(currentUrl);
        var params = parsedUrl.param();

        $("#av-map-div").on("change","xmin-h", function () 
            params["XMIN"] = $("xmin-h").val();
            setURL();
        );

        $("#av-map-div").on("change", "ymin-h", function () 
            params["YMIN"] = $("ymin-h").val();
            setURL();
        );

        $("#av-map-div").on("change", "xmax-h", function () 
            params["XMAX"] = $("xmax-h").val();
            setURL();
        );

        $("#av-map-div").on("change", "ymax-h", function () 
            params["YMAX"] = $("ymax-h").val();
            setURL();
        );


        function setURL() 
            var newURL = "?" + $.param(params);
            console.log(newURL);
        ;

    );

</script>

最好的方法是什么?加分点,mvc 的做法是什么?

编辑/澄清

&lt;inputs&gt; 的值正在由 map.js 文件更新。它使用 ESRI 的 api,因此我将它与应用程序的其余部分分开处理。此脚本既创建隐藏输入(已对段落进行试验),又在每次滚动、平移或缩放地图时更新这些值。我希望将这些参数传递到 URL 中,以便当我们使用查询字符串的其他函数(从而重新加载页面)时,可以维护地图范围。 map.js 有一个功能,可以从 url 中抓取 XMIN, XMAXm YMIN, YMAX 并适当调整地图。否则,它将重置为其初始范围。

它使用下面的 JS 设置 URL 的范围。

var setExtent = function setExtent() 
        console.log("set map extent");
        var xmin = getUrlParameter('XMIN');
        var ymin = getUrlParameter('YMIN');
        var xmax = getUrlParameter('XMAX');
        var ymax = getUrlParameter('YMAX');
        var sr = getUrlParameter('WKID');

        if (typeof xmin == 'undefined' || typeof ymin == 'undefined' || typeof xmax == 'undefined' || typeof ymax == 'undefined' || typeof sr == 'undefined') 
            console.log('null or invalid extent');
        

        else 
            var ext = new Extent(xmin, ymin, xmax, ymax, new SpatialReference( wkid: sr ));
            map.setExtent(ext);
        
    

var getUrlParameter = function getUrlParameter(sParam) 
        console.log('get url param');
        var sPageURL = decodeURIComponent(window.location.search.substring(1)), sURLVariables = sPageURL.split('&'), sParameterName, i;

        for (i = 0; i < sURLVariables.length; i++) 
            sParameterName = sURLVariables[i].split('=');

            if (sParameterName[0] === sParam) 
                console.log(sParameterName[1] === undefined ? true : sParameterName[1]);
                return sParameterName[1] === undefined ? true : sParameterName[1];
            
        
    ;

我的控制器看起来像:

public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page, double? XMIN, double? YMIN, double? XMAX, double? YMAX, int? WKID)
    
        ViewBag.XMIN = XMIN;
        ViewBag.YMIN = YMIN;
        ViewBag.XMAX = XMAX;
        ViewBag.YMAX = YMAX;
        ViewBag.CurrentSort = sortOrder;
        ViewBag.AGMT_NUM_PARM = String.IsNullOrEmpty(sortOrder) ? "AGMT_NUM_DESC" : "";
        ViewBag.EXP_DATE_SORT_PARM = sortOrder == "EXP_DATE" ? "EXP_DATE_DESC" : "EXP_DATE";

        if (searchString != null)
        
            page = 1;
        
        else
        
            searchString = currentFilter;
        

        ViewBag.CurrentFilter = searchString;


        var agreements = from a in db.LANDDATA_MORNINGSTAR_AGREEMENTS select a;

        if (!String.IsNullOrEmpty(searchString))
        
            agreements = agreements.Where(a => a.AGMT_NUM.Contains(searchString)
                                   || a.AGMT_NAME.Contains(searchString));
        

        switch (sortOrder)
        
            case "AGMT_NUM_DESC":
                agreements = agreements.OrderByDescending(a => a.AGMT_NUM);
                break;
            case "EXP_DATE":
                agreements = agreements.OrderBy(a => a.EXPR_DATE);
                break;
            case "EXP_DATE_DESC":
                agreements = agreements.OrderByDescending(a => a.EXPR_DATE);
                break;
            default:
                agreements = agreements.OrderBy(a => a.AGMT_NUM);
                break;
        

        int pageSize = 10;
        int pageNumber = (page ?? 1);
        return View(agreements.ToPagedList(pageNumber, pageSize));

    

【问题讨论】:

哪里失败了?并且您正在收听$("#av-map-div") 更改,它真的会触发更改事件吗? javascript 文件设置了一个监听器,该监听器将更改发布到位于 #av-map-div 中的隐藏输入。 一个问题可能是加载的顺序脚本......进一步调查...... 位于#av-map-div 中的隐藏输入无关紧要。不幸的是,change 无济于事,如果您尝试在另一个 div 中监听隐藏输入 xmin、xmax 等的更改,然后相应地更新查询参数。我鼓励您从 jQuery 文档中检查change 的工作方式..我将分享一个提议的选项.. 要传递到 URL 的参数,当 URL 从 setUrl() 更改为 location.href = http://abcd.com?xmin=1&amp;ymin=2&amp;..... 时,您的位置将被更新并且浏览器将导航。如果每次地图范围更改时更新 URL,这将导航和更新,可能会导致无限循环。我希望你能关注。 【参考方案1】:

假设您的每个属性都有一个input,例如:

<div id="myProps">
    <input type="number" data-propname="xmin-h" value="yourvalue" class="propclass" />
    <input type="number" data-propname="xmax-h" value="yourvalue" class="propclass" />
    <!-- all the rest here -->
</div>

然后您可以使用blur 收听此输入的更改(当失去对输入的关注时,更改 url):

var config = 
    mypropscontainer: '#myProps',
    myprop: '.propclass'
;

$(document).ready(function () 
    $(config.mypropscontainer).on('blur', config.myprop, function () 
        // This will find all the properties and put them in a list
        var allProps = $(config.mypropscontainer).find(myprop);

        // Iterate the list and create the new url
        var _url = '/controller/action?';
        $.each(allProps, function (index, item) 
            var _propname = $(item).data('propname'); // Will return xmin-h, xmax-h, etc...
            var _propvalue = $(item).val();

            _url = _url + _propname + "=" + _propvalue;

            // If is not the last element append also an '&'
            if (index !== allProps.Count - 1) 
                _url = _url + '&';
            
        );

        // Do something with your _url here
    );
);

【讨论】:

在这种情况下,输入对用户可见。我希望在幕后处理这个问题。 那么更新是如何发生的呢?或者为什么你需要实际的 change 事件来修改 url? 这些值由 map.js 文件更新。它使用 ESRI 的 api,因此必须与应用程序的其余部分分开处理。我有这个脚本创建隐藏的输入(已经尝试了一个段落),并在每次滚动地图时更新这些值。我希望将这些参数传递到 URL 中,以便当我们查询字符串的其他函数重新加载页面时,可以维护地图范围。 map.js有一个功能,可以从url中抓取XMIN,XMAXm YMIN,YMAX并适当调整地图。

以上是关于ASP.NET MVC - 输入值更改更新 URL 参数的主要内容,如果未能解决你的问题,请参考以下文章

更改 ASP.NET MVC 或 IIS 中的 URL 根路径

如何通过更改 ASP.NET MVC 中的 Url 来阻止对控制器的访问?

ASP.NET MVC C# Razor SQL 1 of 2 几乎相同的更新查询不起作用

在 ASP.NET MVC 中的下拉列表上触发 jQuery 更改事件并将参数传递给 url 操作

ASP.NET MVC Url.Action 和路由名称值

ASP.NET MVC 路由 - 将入站路由值自动传递给出站 URL?