当我在Visual Studio中创建一个MVC项目时,它为我支持控制器。在“详细信息”,“编辑”和“删除操作”中,“操作”中的“int?id”参数。
这个id来自哪里?它如何知道要查找哪个ID?它只是知道它正在寻找与该对象相关的主键ID吗?
谢谢!
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Comment comment = db.Comments.Find(id);
if (comment == null)
{
return HttpNotFound();
}
return View(comment);
}
答案 0 :(得分:0)
AFAIK,在使用脚手架创建具有CRUD操作的控制器时,MVC在RegisterRoutes
方法中寻找默认路由,如下所示:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute(
name: "Default", // Route name
url: "{controller}/{action}/{id}", // URL with parameters
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
}
从上面的路由定义,id
参数被声明为可选参数,但在编辑或删除操作期间,控制器需要通过提供id
参数来了解应编辑/删除哪些数据。
选择Nullable<int>
后面的原因是声明id
参数是为了确保检查从视图端传递的可能空值(注意控制器使用{{1基于主键值在数据库中搜索}})。
答案 1 :(得分:0)
好的,我会尝试解释。当您创建一些控制器(非空)时,它会为您编写一些默认操作。如下所示。
索引 - 显示实体模型的数据列表。 Create-它使您能够创建新对象(实例)并将其添加到实体模型中。 删除 - 删除实例。 详细信息 - 如果要查看实例的详细信息,请使用此操作。参数是“Id”。因此,服务器根据db中的Id(主键)获取确切的实例。那么这个动作如何获得Id呢?答案是:从视角来看。从视图中,您通过发送它的id请求单个实例的详细视图。那有意义吗?我将在这里附上网格图片。Sample Grid
因此,如果从右侧看,从网格中可以看到笔标志和页面标志。页面标志是我的详细信息按钮。因此,如果我点击第一行的页面标志,我将发送名字为Rupa的实例的主键,并请求服务器获取此实例的详细数据。
希望它有所帮助。