带有可选参数和部分视图的asp.net mvc

时间:2009-09-21 13:33:42

标签: asp.net-mvc

我有:

AlbumsController PhotoRepository Index.aspx(查看)

在Index.aspx里面,我有一个部分视图调用AlbumControl。我想通过ajax和ajaxhelper来更新它。

问题是我希望能够执行以下操作:

http://www.mysite.com/Albums
http://www.mysite.com/Albums?FilterTag=Birthdays

当我这样做时,我收到以下错误:

控制器类型'AlbumsController'上的当前操作请求'索引'在以下操作方法之间不明确:

类型Controllers.AlbumsController上的System.Web.Mvc.ActionResult索引(System.String) Controllers.AlbumsController类型的System.Web.Mvc.ActionResult Index()

我原本以为asp.net mvc会想到它在哪里如果我传入查询字符串中的参数它将转到索引(字符串Tag)方法,如果我没有传入参数,它会去Index()。

建议?

1 个答案:

答案 0 :(得分:4)

问题是MVC路由引擎无法区分: -

1)调用索引()

2)使用tag = null

调用索引(字符串标记)

这就是为什么它说这个请求含糊不清。

你可以这样做: -

public ActionResult Index(string tag)
{
  if(String.IsNullOrEmpty(tag))
  {
    // index code goes here
    return View("Index");
  }
  else
  {
    // code to handle filtered view goes here
    return View("Tag");
  }
}

或者您可以使用自定义属性强制使用该参数: -

ASP.NET MVC ambiguous action methods

或者你可以设置路线,以便专辑和专辑?FilterTag = X明确地采取不同的行动(顺便提一下,我推荐“专辑”和“专辑/ X”): -

  routes.MapRoute("AlbumsIndex", "Albums",
    new { controller = "Albums", action = "Index" });
  routes.MapRoute("AlbumsTag", "Albums/{tag}",
    new { controller = "Albums", action = "Tag", tag = "" });
  routes.MapRoute("Default", "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = "" );

public ActionResult Index() { ... }
public ActionRestlt Tag(string tag) { ... }