【问题标题】:ASP.net mvc ActionResult parameterASP.net mvc ActionResult 参数
【发布时间】:2014-01-09 16:09:32
【问题描述】:

我的控制器如下所示:

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. 一些用户名
2. 获取用户主页数据
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;
}

【问题讨论】:

  • 你的路由表是什么样的?
  • @Grumbler85 我已经编辑了帖子并添加了路线代码
  • 例如,您如何访问 GetUserHomeData?
  • 请指定测试的 url、结果参数和调用的控制器操作。
  • @Grumbler85 我再次编辑帖子并添加了那段代码

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


【解决方案1】:

问题是你可能在你的 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 }
                );

这将导致这样的 URL:http://domain/Profile/?userName=someUserhttp://domain/p/someUser

【讨论】:

  • 有没有其他办法解决这个问题?
  • 可以重写路由,使其与控制器名称不匹配
猜你喜欢
  • 2014-04-09
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 2013-11-19
相关资源
最近更新 更多