我的控制器看起来像这样:
public ActionResult Index(string username)
{
if (string.IsNullOrEmpty(username))
{
_userId = User.Identity.GetUserId();
}
else
{
var user = UserService.GetUserByUserName(username);
if (user != null)
{
_userId = user.Id;
}
else
{
return RedirectToAction("Index", "Routines");
}
}
return View();
}
[HttpGet]
public JsonResult GetUserHomeData()
{
return Json(CreateHomeViewModel(), JsonRequestBehavior.AllowGet);
}
[HttpGet]
public JsonResult GetUserStatisticsOverview()
{
return Json(CreateUserStatisticsOverviewViewModel(), JsonRequestBehavior.AllowGet);
}
我对ActionResult Index的参数用户名有疑问。我监视了用户名变量,如果我输入这样的url:www.test.com/profile/someUserName
为变量用户名分配以下值:
1. someUserName
2. GetUserHomeData
3. GetUserStatisticsOverview
我从我的javaScript文件中调用这些Get方法,为什么会发生这种情况?如何防止这种情况,即只捕获“someUsername”
这是我的路线配置:
routes.MapRoute("Profile", "profile/{userName}",
new { controller = "Profile", action = "Index", userName = UrlParameter.Optional }
);
routes.MapRoute("Default", "{controller}/{action}/{id}",
new {controller = "Home", action = "Index", id = UrlParameter.Optional }
);
以下是我访问Get方法的方法(我使用的是Angular的$ http)
getResult: function() {
var input = $http.get("/Profile/GetUserHomeData");
var deferred = $q.defer();
deferred.resolve(input);
return deferred.promise;
}
答案 0 :(得分:2)
问题是你可能在你的JS中调用了类似@Url.Action("GetUserHomeData", "Profile")
的内容,但是这将被第一个路由捕获,并且其中的操作有Index
而没有别的。
您可以通过删除路径
routes.MapRoute("Profile", "profile/{userName}",
new { controller = "Profile", action = "Index", userName = UrlParameter.Optional }
);
或者你可以重写规则(它与控制器名称不匹配):
routes.MapRoute("ProfileShortRoute", "p/{userName}",
new { controller = "Profile", action = "Index", userName = UrlParameter.Optional }
);
这将导致这样的网址:http://domain/Profile/?userName=someUser
或http://domain/p/someUser