переопределение виртуального метода, но с новой сигнатурой: так что можно использовать привязку пользовательской модели - PullRequest
0 голосов
/ 09 декабря 2010

У меня есть абстрактный класс с определенной виртуальной функцией:

public abstract class ContentController
{
    public virtual ActionResult Index();
}

У меня есть класс, производный от вышеуказанного базового класса:

public class CartController : ContentController

Мне нужен CartController, чтобы иметь возможность привязывать корзину с привязкой пользовательской модели по его методу Index. Что-то, что обычно выглядит так:

    public ActionResult Index(Cart cart)

Если я просто помещаю функцию Index (Cart) в класс CartController, я получаю эту ошибку:

The current request for action 'Index' on controller type 'CartController' is ambiguous between the following action methods:
ActionResult Index() on type CartController
ActionResult Index(Cart) on type CartController

Единственное решение, которое я до сих пор нашел, - это переименовать мою функцию привязки модели и перенаправить из переопределенного метода Index:

    public override ActionResult Index()
    {
        return RedirectToAction("IndexWithCart");
    }

    public ActionResult IndexWithCart(Cart cart)
    {
        return View("Index", cart); 
    }

Это работает, но тогда мой URL / Cart / IndexWithCart. Есть ли способ сделать это и по-прежнему использовать только URL / Cart без изменения базового класса?

Ответы [ 3 ]

2 голосов
/ 09 декабря 2010

Да, просто настройте свой маршрут, чтобы он указывал на действие IndexWithCart, когда у вас есть / Cart URL:

routes.MapRoute(
                "IndexWithCartRoute",
                "Cart",
                new { controller = "Cart", action = "IndexWithCart" }
            );
0 голосов
/ 09 декабря 2010

как насчет использования [HttpPost] затем
действие «Индекс» не будет двусмысленным в вашем базовом контроллере и дочернем контролере

[HttpPost] общедоступный указатель ActionResult (корзина)

{    

    return View(cart);    

}    
0 голосов
/ 09 декабря 2010

как насчет (для базового контроллера):

public abstract class ContentController<T> : Controller
{
    public abstract ActionResult Index(T item);
}

с последующим (для унаследованного контроллера):

// just for the example
public class Cart
{
    public string Foo { get; set; }
}

public class HomeController : ContentController<Cart>
{
    public override ActionResult Index(Cart item)
    {
        //var cart = new Cart {Foo = "this is my cart test"};
        //return View(cart);  
        return View(item); 
    }
}

может работать.

[править] - можно попробовать еще один способ (базовый класс):

public abstract class ContentController<T> : Controller 
{
    public virtual ActionResult Index()
    {
        return View();
    }
    internal ActionResult Index(T item)
    {
        return View(item);
    }
}

и для контроллера:

// just for the example
public class Cart
{
    public string Foo { get; set; }
}

public class HomeController : ContentController<Cart>
{
    public override ActionResult Index()
    {
        Cart cart = null; // new Cart { Foo = "this is my 1st cart test" };
        if (cart != null)
            return Index(cart);
        else
            return base.Index();
    }
}

Я весь обескуражен:)

...