MVC HttpGet 编辑方法参数(字符串 userId 与字符串 Id)

MVC HttpGet Edit method Parameters (string userId vs string Id)

我刚刚花了几个小时试图弄清楚为什么当我尝试获取单个对象时我的编辑操作没有捕捉到 UserId 值。

这没用

[HttpGet]
public ActionResult Edit(string userId)
{            
    var user = _profile.ClubProfiles.First(u => u.UserId == userId);
    var model = new EditUserViewModel();
    model.PhoneNumber = user.MyUser.PhoneNumber;
    model.FirstName = user.FirstName;
    model.LastName = user.LastName;
    model.UserId = user.UserId;

    return View(model);
}

有效

[HttpGet]
public ActionResult Edit(string Id)
{            
    var user = _profile.ClubProfiles.First(u => u.UserId == Id);
    var model = new EditUserViewModel();
    model.PhoneNumber = user.MyUser.PhoneNumber;
    model.FirstName = user.FirstName;
    model.LastName = user.LastName;
    model.UserId = user.UserId;

    return View(model);
}

为什么第二个参数(字符串 Id)起作用而第一个参数(字符串 userId)不起作用?

这是我的索引视图中的路线

@Html.ActionLink("Edit", "Edit", new { id = item.UserId })

这是我的默认路线

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Profile", action = "Index", id = UrlParameter.Optional }
            );

你应该知道在你的 Global.asax.cs 文件的某个地方,有一个名为 RegisterRoutes 的方法,它有这样的东西:

routes.MapRoute(
    "Default",                                              // Route name 
    "{controller}/{action}/{id}",                           // URL with parameters 
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

这意味着当您调用(例如)url yourController/edit/123 时,它将搜索一个名为 yourController 的控制器,一个名为 edit 的方法id 作为参数。这是默认的,当然你可以改变它并用这些路由做任何你需要的。

但是,如您所见,这是在搜索 id,而不是 userId,我认为这是您的解释,如果我错了请告诉我。