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'
我发现 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'