С ASP.NET MVC, как пользователи могут ПУБЛИКОВАТЬ модель в зависимости от того, что было выбрано в списке выбора?

#c# #asp.net-mvc

Вопрос:

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

Просто для демонстрации я скажу, что мой объект — «Покемон». Поэтому у меня есть интерфейс для «Покемонов» со статистикой, которая относится ко всем из них, что-то вроде:

 public interface IPokemon
{
        string Type { get; set; }
        public static List<SelectListItem> TypeList { get; }
        int HPStat { get; set; }
        int ATKStat { get; set; }
        int DEFStat { get; set; }
        int SPATKStat { get; set; }
        int SPDEFStat { get; set; }
}
 

Затем у меня есть абстрактный Pokemon класс:

 public abstract class Pokemon : IPokemon
{
    public static List<SelectListItem> TypeList { get; } = new List<SelectListItem>
    {   new SelectListItem { Value = "Bulbasaur", Text = "Bulbasaur" },
        new SelectListItem { Value = "Squirtle", Text = "Squirtle" },
        new SelectListItem { Value = "Charmander", Text = "Charmander" }
    };
    // also implements each of the int Stats
}
 

В HTML я привязываю select к TypeList , для строки Type в интерфейсе IPokemon. Объект, переданный с сервера Bulbasaur , по умолчанию является a.

 <select asp-for="Type" asp-items="IPokemon.TypeList"></select>
 

Когда я пытаюсь опубликовать результат, возникает ошибка, потому что an IPokemon не может быть инициализирован.

Я понимаю, почему возникает ошибка, но мне трудно понять, как лучше всего структурировать это взаимодействие в целом. Я предположил, что хочу вернуть другой объект модели в зависимости от того, какой пользователь выбирает, но я также думаю, что у меня может быть неправильная интерпретация того, как это должно быть структурировано в целом.

После этого шага я решил, что создам правильный объект модели в зависимости от того, что было возвращено, а затем продолжу процесс создания, разрешив определенные параметры в зависимости от того, какой Pokemon класс был выбран на этом первом шаге. Пример; если бы на этом шаге был выбран Squirtle, я бы хотел перейти на страницу, которая позволяет выбирать различные движения «типа воды».

Любые разъяснения или указания на ресурсы, позволяющие узнать, как этого достичь, приветствуются.

Комментарии:

1. Что такое класс модели для вашего представления? Можете ли вы показать весь вид, а не только одну строку?

Ответ №1:

Вот несколько советов:

Во-первых, мне интересно, действительно ли вы хотели сделать свою Pokemon.TypeList статику? На данный момент то, как вы это сделали, означает, что у каждого объекта типа Pokemon (или любого из его подклассов) будет список всех Pokemon типов. Это похоже на большое дублирование данных.

Во-вторых, в поле со списком у вас есть asp-items="IPokemon.TypeList" , но TypeList объект в данный момент находится в Pokemon классе, а не в IPokemon интерфейсе. Я ожидаю, что это опечатка, на которую вы на самом деле хотите указать Pokemon.TypeList . Кроме того, на самом деле у вас все равно не было бы списка типов, находящихся в интерфейсе. Им было бы лучше сидеть в базовом классе или даже просто в своем собственном статическом классе где-нибудь в другом месте.

В-третьих, что касается структуры: если все ваши Pokemon объекты наследуются от вашего абстрактного базового класса, мне кажется, было бы разумнее, чтобы все ваши абстрактные IPokemon методы находились в вашем базовом классе, так как добавление дополнительного интерфейса только добавляет здесь сложности.

Я помню, как читал одну вещь с точки зрения таких вещей , как наследование и интерфейсы, которая застряла у меня: когда деревья наследования преподаются в академическом контексте, это делается с учетом того, что у вас будет очень иерархическая структура наследования (например, классы A и B наследуются от класса C, классы C и D наследуются от класса E), тогда как в реальном мире ваши структуры наследования, как правило, очень плоские (например, классы A, B, C и D все наследуются от класса E), Все намного проще сделать таким образом.

Надеюсь, эти указания имеют для вас смысл! Если нет, задайте мне вопрос

Комментарии:

1. Хорошо, что интерфейс на самом деле ничего для меня не делает. Спасибо вам за этот совет. Список должен быть статичным, и я отредактировал вопрос, чтобы отразить это. Базовый класс по-прежнему будет абстрактным, значит ли это, что я должен расширить его до класса, специально предназначенного для этого представления? Было бы слишком «банально» использовать a Bulbasaur.TypeList ?

2. Дело в том, что абстрактный класс может иметь статические члены, такие как List<объект>, поэтому такой список, как ваш, может прекрасно поместиться в вашем базовом классе 🙂 Однако я мог бы захотеть, чтобы в моем абстрактном классе был список<строка> для типов, а затем мое представление или где-то еще преобразовало его в список<строка><SelectListItem>, поскольку ваша модель не должна заботиться о логике представления