ASP.net mvc ActionResult参数

时间:2014-01-09 16:09:32

标签: asp.net asp.net-mvc asp.net-mvc-5

我的控制器看起来像这样:

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;
}

1 个答案:

答案 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=someUserhttp://domain/p/someUser