2009-09-21 2 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» неоднозначен между следующими способами:

System.Web.Mvc.ActionResult Index (System.String) по типу Controllers.AlbumsController System.Web.Mvc.ActionResult Index() на тип Controllers.AlbumsController

я бы подумал, что asp.net MVC мог бы выяснить, где, если я передам параметр в querystring, он перейдет к методу Index (string Tag), и если бы я не прошел параметр, он переместился бы в Index().

Предложения?

ответ

4

Проблема заключается в том, что MVC маршрутизации не может сказать разницу между: -

1) Calling Index()

и

2) Вызов Index (строка тегов) с тегом = 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) { ... } 
+1

Довольно много, что я собирался напечатать. Лично, однако, я бы стрелял больше для стороны атрибута, чтобы либо установить значение по умолчанию, если не там, либо перенаправить на ошибку. Просто упрощается, чтобы избежать повторного кода, если это параметр, который появляется много. –

+0

Инструмент Programmin - какой будет подход атрибута здесь? – leora

+0

Видя, что это не что-то встроенное в маршрут (IE имеет? И тег в URL-адресе), возможно, просто проверьте filterContext.ActionParameters, чтобы узнать, существует ли он. Если это не так, добавьте его.Если он имеет значение null, задайте параметр по умолчанию. Это только, если вы не хотите проверять значение null в действительном методе. Если вы не возражаете, что это возможно, скорее всего, вам понадобится пример проверки нулевой строки. Я использую атрибуты для вещей, которые, как я знаю, будут использоваться во многих местах, таких как установка pageNumber в 0, если он не существует. –

Смежные вопросы