2009-09-21 71 views
1

我有: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'上的'Index'在以下操作方法之间不明确:

System.Web.Mvc.ActionResult指数上型Controllers.AlbumsController型Controllers.AlbumsController System.Web.Mvc.ActionResult指数()(System.String)

我本来以为asp.net的MVC如果我在查询字符串中传入一个参数,它会去索引(字符串标签)方法,如果我没有传入参数,它会去索引()。

意见建议?

回答

4

的问题是,MVC路由引擎不能告诉之间的区别: -

1)调用index()

2)调用指数(字符串标签)与标签= 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 = ""); 

and

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

几乎我要打字的东西。就个人而言,我会为它的属性侧拍更多的值,以便将值设置为默认值(如果不存在)或将错误重定向。只是让它更容易避免重复代码,以防万一它成为一个参数。 – 2009-09-21 14:02:00

+0

Programmin工具 - 这里的属性方法是什么? – leora 2009-09-21 15:30:39

+0

由于它不是构建到路由中的东西(IE在url中包含?和tag),可能只需检查filterContext.ActionParameters以查看它是否存在。如果没有,请添加它。如果它为空,则设置一个默认参数。这只是如果你不想在实际的方法中检查null。如果您不介意这样做,那么执行空字符串检查示例可能会更快。 我使用属性的东西,我知道会用在很多地方,如设置pageNumber为0,如果它不存在。 – 2009-09-21 20:28:16