actionlink на основе наследования asp.net mvc 3 - PullRequest
0 голосов
/ 25 июля 2011

Допустим, у меня есть 3 класса A, B и C. B и C наследуются от A, который содержит строковое поле Name.

Я реализовал контроллеры As, B и C для каждого класса. Я могу перечислить все экземпляры B и C в представлении, называемом Index, созданным контроллером As.

Контроллеры Bs и C также имеют метод Details, который выводит представление с учетом идентификатора для экземпляров B и C. соответственно.

Я задаюсь вопросом о самом чистом способе создания ссылок на действия для страниц сведений для объектов B и C? Я мог бы использовать GetType () и создать имя контроллера на основе этого, но это кажется немного громоздким.

Надеюсь, это имеет смысл. С нетерпением жду Вашего ответа. Спасибо.

Christian

Ответы [ 2 ]

1 голос
/ 25 июля 2011

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

public static class AExtensions
{
    public static string GetControllerName(this A obj)
    {
       // put logic to determine type here
       if( obj is B ) return "BController";
       else if( obj is C ) return "CController";
       else return "AController";

    }
}

Тогда, по вашему мнению, вы можете получить ссылку:

@Html.ActionLink("Details", "Details", obj.GetControllerName(), new { id= obj.Id })

Этот метод заставляет меня чувствовать себя грязным, но, похоже, он работает.

0 голосов
/ 26 июля 2011

Кто-то должен принять решение о типе объекта. Все, что остается, это где вы это делаете. Если у вас есть только один список со всеми типами в нем, вы можете разделить список в контроллере. Затем рекомбинируйте типы в представлении.

foreach (var obj in AllObjs)
{
   if (obj.GetType().Equals(typeof(B))
     Model.AllBType.Add(obj);
   else
     Model.AllCType.Add(obj);
}

@foreach (var obj in Model.AllBType)
   Html.ActionLink("Details", "Details", "BController", new { id = obj.Id });

@foreach (var obj in Model.AllCType)
   Html.ActionLink("Details", "Details", "CController", new { id = obj.Id });

Если вы создаете объекты B и C или запрашиваете их отдельно по типу, почему бы просто не сохранить эти результаты в виде независимых списков в вашей модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...