MVC HttpGet Edit方法参数(字符串userId vs string Id)

时间:2015-01-20 02:13:54

标签: c# razor asp.net-mvc-5

我花了几个小时试图找出当我尝试获取单个对象时,为什么我的编辑操作没有捕获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 }
            );

1 个答案:

答案 0 :(得分:2)

您应该知道,在Global.asax.cs文件的某个位置,有一个名为RegisterRoutes的方法,其中包含以下内容:

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

这意味着当您致电(例如)网址yourController/edit/123时,它会搜索名为yourController的控制器,这个方法名为editid为一个参数。这是默认情况下,当然您可以更改它并使用这些路径执行您需要的任何操作。

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