ASP.NET MVC3: ActionMethod с тем же именем и разными аргументами для представления списка и сведений. - PullRequest
0 голосов
/ 25 декабря 2011

У меня есть ProdcutsController, где у меня есть 2 метода действий. Индекс и детали. Index вернет список продуктов, а Details вернет детали выбранного продукта.

Так что мои URL похожи на

sitename/Products/   

загрузит индексное представление для отображения списка продуктов.

 sitename/Products/Details/1234  

загрузит подробное представление, чтобы показать детали продукта 1234.

Теперь я хочу избежать слова "Подробности" из моего второго URL. чтобы он выглядел как

   sitename/Products/1234 

Я попытался переименовать свой метод действия из «Подробности» в «Индекс» с параметром в нем. Но это показало мне ошибку "Method is is ambiguous"

Я пробовал это

 public ActionResult Index()
{
    //code to load Listing view
}
public ActionResult Index(string? id)
{
    //code to load details view
}

Я получаю эту ошибку сейчас

The type 'string' must be a non-nullable value type in order to use
it as parameter 'T' in the generic type or method 'System.Nullable<T>

Понял, что он не поддерживает перегрузку метода! Как мне справиться с этим? я должен обновить свое определение маршрута?

Ответы [ 3 ]

1 голос
/ 25 декабря 2011

Используйте это:

public ActionResult Index(int? id)
{
    //code to load details view
}

Предполагая, что значение является целочисленным типом.

Это еще один вариант:

public ActionResult Index(string id)
{
    //code to load details view
}

A string является ссылочным типом, поэтому ему может быть назначен null без необходимости Nullable<T>.

0 голосов
/ 26 декабря 2011

Вы можете создать два маршрута и использовать ограничения маршрута:

Global.asax

        routes.MapRoute(
            "Details", // Route name
            "{controller}/{id}", // URL with parameters
            new { controller = "Products", action = "Details" }, // Parameter defaults
            new { id = @"\d+" }
        );

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

Первый маршрут имеет ограничение, которое требует, чтобы идентификатор имел одну или несколько цифр. Из-за этого ограничения он не будет ловить маршруты типа ~/home/about и т. Д.

ProductsController

    public ActionResult Index()
    {
        // ...
    }

    public ActionResult Details(int id)
    {
        // ...
    }
0 голосов
/ 25 декабря 2011

Вы можете использовать только один метод действия.

Что-то вроде:

public ActionResult Index(int? Id)
{
  if(Id.HasValue)
  {
    //Show Details View
  }
  else
  {
    //Show List View
  }
}
...