Asp.net mvc MVC控制器中的重载Index()方法
我想访问/Blog和/Blog/1,其中“1”是博客的ID。这是我的密码:Asp.net mvc MVC控制器中的重载Index()方法,asp.net-mvc,vb.net,asp.net-mvc-3,Asp.net Mvc,Vb.net,Asp.net Mvc 3,我想访问/Blog和/Blog/1,其中“1”是博客的ID。这是我的密码: ' ' GET: /Blog/ Function Index() As ViewResult Return (View(db.Blogs.ToList())) End Function ' ' GET: /Blog/(Integer) Function Index(id As Integer) As ViewResult Dim
'
' GET: /Blog/
Function Index() As ViewResult
Return (View(db.Blogs.ToList()))
End Function
'
' GET: /Blog/(Integer)
Function Index(id As Integer) As ViewResult
Dim blog As Blog = db.Blogs.Find(id)
Return View("Details", "_MyLayout", blog)
End Function
它给出了错误:
“/”应用程序中出现服务器错误
控制器类型上操作“索引”的当前请求
“BlogController”在以下操作方法之间不明确:
类型上的System.Web.Mvc.ViewResult Index()
GemcoBlog.GemcoBlog.BlogController System.Web.Mvc.ViewResult
GemcoBlog.GemcoBlog.BlogController类型上的索引(Int32)
描述:在执行过程中发生未处理的异常
当前的web请求。请查看堆栈跟踪以了解更多信息
有关错误的信息及其在代码中的来源
异常详细信息:System.Reflection.AmbiguousMatchException:
对控制器类型“BlogController”的操作“索引”的当前请求
以下操作方法之间不明确:
类型上的System.Web.Mvc.ViewResult Index()
GemcoBlog.GemcoBlog.BlogController System.Web.Mvc.ViewResult
GemcoBlog.GemcoBlog.BlogController类型上的索引(Int32)
源错误:
在执行过程中生成了未处理的异常
当前web请求。关于货物来源和位置的信息
可以使用下面的异常堆栈跟踪来识别异常
如何重载Index()方法
编辑:
我也在尝试这样将它们结合起来:
'
' GET: /Blog/
Function Index(id As Integer) As ViewResult
If (id) Then
Dim blog As Blog = db.Blogs.Find(id)
'Return View(blog)
Return View("Details", "_MyLayout", blog)
Else
Return (View(db.Blogs.ToList()))
End If
'Return View(db.Blogs.Where(Function(x) x.Name = "Test").ToList())
End Function
但是,我得到的错误是:
“/”应用程序中出现服务器错误
参数字典包含的参数“id”为空
方法“System.Web.Mvc.ViewResult”的不可为空类型“System.Int32”
“Blog.Blog.BlogController”中的索引(Int32)”。可选的
参数必须是引用类型、可为null的类型或声明为
可选参数。参数名称:参数
描述:在执行过程中发生未处理的异常
当前的web请求。请查看堆栈跟踪以了解更多信息
有关错误的信息及其在代码中的来源
异常详细信息:System.ArgumentException:参数字典
包含不可为null的类型的参数“id”的null项
中“System.Web.Mvc.ViewResult Index(Int32)”方法的“System.Int32”
'Blog.Blog.BlogController'。可选参数必须是
引用类型、可为null的类型或可声明为可选类型
参数参数名称:参数
源错误:
在执行过程中生成了未处理的异常
当前web请求。关于货物来源和位置的信息
可以使用下面的异常堆栈跟踪来识别异常
不能在同一控制器上使用同一HTTP谓词访问两个操作。因此,要么更改操作名称,要么必须使用不同的HTTP动词消除歧义。例如:
<HttpPost>
Function Index(id As Integer) As ViewResult
Dim blog As Blog = db.Blogs.Find(id)
Return View("Details", "_MyLayout", blog)
End Function
由于它不可为null,因此它会自动假定您在默认情况下提供了一个id。将Id设为可为空的整数,它将适用于两个URL
函数索引(id为Nullabe(整数的))作为ViewResult有几种方法可以做到这一点。最简单的方法是将第一个方法重命名为“ShowBlog”或任何您想要的方法,然后在global.asax中设置一个路由,该路由不带参数地路由到/Blog路由 例如(在c中): 确保MapRoute位于默认路由之前
要使第二个方法工作,您需要将id设置为null,然后检查方法中的null。对Erik的帖子进行小修改,使其工作(我使用的是MVC4)
这不意味着URL必须是/Blog/Show/1而不是Blog/1吗?如果我把它们合并成一种方法呢。我用新代码更新了问题,但它也给了我一个错误。您可以在Global.asax中的路由配置中将
Show
操作设为默认值:action=“Show”
,而不是action=“Index”
。现在您可以使用/Blog/123
。不,不要把这两个动作组合成一个动作。这将是一个糟糕的设计决策。
Function Index() As ViewResult
Return (View(db.Blogs.ToList()))
End Function
'
' GET: /Blog/(Integer)
Function Show(id As Integer) As ViewResult
Dim blog As Blog = db.Blogs.Find(id)
Return View("Details", "_MyLayout", blog)
End Function
routes.MapRoute("Blog", "Blog", new { controller = "Blog", action = "ShowBlog" });
routes.MapRoute("Blog", "Blog/{id}", new { controller = "Blog", action = "ShowBlog" });