MVC:使用路由时获取方法的 URL

MVC: Get URL of Method When Using Routing

我发现 this tutorial 关于如何使用 Razor 语法在 MVC 中构建级联下拉列表。我按照教程进行操作,并使其在自己的项目中完美运行。但是现在我正试图将它移植到我的实际项目中,当第一个下拉菜单被更改时我收到了一个错误。根据脚本,会弹出一条警告:

Failed to retrieve states: [object Object]

我不知道 [object Object] 是什么意思。我的 猜测 是错误与 Url:

有关
url: '@Url.Action("GetStates")

但这只是一个猜测。示例项目和真实项目的主要区别在于真实项目使用路由 URL 这是整个脚本:

<script src="~/Scripts/jquery-1.10.2.js" type="text/javascript"></script>
<script src="~/Scripts/jquery-1.10.2.min.js" type="text/javascript"</script>
<script type="text/javascript">
$(document).ready(function () {
    //Dropdownlist Selectedchange event
    $("#Country").change(function () {
        $("#State").empty();
        $.ajax({
            type: 'POST',
            url: '@Url.Action("GetStates")', // we are calling json method

            dataType: 'json',

            data: { id: $("#Country").val() },
           // here we are get value of selected country and passing same value as input to json method GetStates.

            success: function (states) {
                // states contains the JSON formatted list
                // of states passed from the controller

                $.each(states, function (i, state) {
                $("#State").append('<option value="' + state.Value + '">' +
                     state.Text + '</option>');
                // here we are adding option for States

                });
            },
            error: function (ex) {
                alert('Failed to retrieve states: ' + ex);
            }
        });
        return false;
    })
});

编辑后:

在 Chrome 的开发者工具中观察网络流量时,我在 stand-alone 项目中进行了此操作,并看到了标题为 "GetStates" 的条目和 URL: http://localhost:50266/CustomerFeedback/GetStates.

我在我的实际项目中又做了一次,这次我看到一个条目说“45/”和这个 URL: http://localhost:65303/PatientSatisfactionSurvey/45/

我认为这证实了我的怀疑 URL 是问题所在。我将不得不尝试弄清楚如何使这个 URL 有效。

另一个编辑:

在有效的项目上,如果我去:http://localhost:50266/CustomerFeedback/GetStates

我明白了:

Server Error in '/' Application.

This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet.

这是预料之中的,因为我正在尝试使用该实际方法。意思是,我可以转到方法的URL。但是当我尝试在我的项目中做同样的事情时:http://localhost:65303/PatientSatisfactionSurvey/GetStates,它只是加载页面。那是因为它认为 "GetStates" 是一个参数,而不是方法。

我无法弄清楚该方法的 URL 是什么!!该死的路由妨碍了....

        routes.MapRoute(
            "PatientSatisfactionSurvey",
            "PatientSatisfactionSurvey/{ApptID}/{*LanguageCode}",
            new { controller = "Forms", action = "PatientSatisfactionSurvey" },
            namespaces: new[] { "GEDC.Controllers" }
        );

尝试将@Url.Action("GetStates") 更改为:

@Url.Action("ControllerName", "ActionName")

可能是 @Url.Action("PatientSatisfactionSurvey", "GetStates") 这将生成一个像 ~/PatientSatisfactionSurvey/GetStates/5 这样的 URL,其中 5 是它从具有国家/地区 ID 的 html 元素中获取的 ID。

终于解决了。我的问题是三方面的。首先,当我查看 HTML 源代码时,结果是这样的:

url: '@Url.Action("GetStates")', // we are calling json method

呈现如下:

url: ''

一旦我去掉了 razor 语法,它至少在 HTML 中正确呈现。然而,还是弄错了URL。因为我使用的路由映射中有参数,所以我最终只为这个方法创建了一个全新的路由映射:

        routes.MapRoute(
            "GetStates",
            "GetStates",
            new { controller = "Forms", action = "GetStates" },
            namespaces: new[] { "xyz.Controllers" }
        );

然后我将 javascript 中的 URL 行更改为如下所示:

url: 'GetStates'

但问题在于它只是将 /GetStates 附加到 URL 我碰巧在的任何内容的末尾。如果把整个完全合格的 URL 放在那里,像这样...

url: 'http://localhost:65303/GetStates'

成功了。但出于显而易见的原因,URL 不是一个长期的解决方案。于是,using this thread,我终于找到了答案。我能够获得此方法 GetStates() 的完全限定 URL,如下所示:

// Get the fully qualifed URL of the FollowUpOptions() method for use in building the cascading dropdown
UrlHelper Url = new UrlHelper(System.Web.HttpContext.Current.Request.RequestContext);
myModel.ullDropdownUrl = Url.Action("GetStates", "Forms", new { }, this.Request.Url.Scheme);

然后我能够在 javascript 中执行此操作,最终一切正常:

url: '@Model.fullDropdownUrl'