Все новички MVC изначально избегают слова 'M', но они начинаются в начале аббревиатуры MVC. Поэтому, может быть, просто может быть, вы захотите начать свое решение с Модели ... просто говоря.
Не повторяйте себя (СУХОЙ). Вы собираетесь в конечном итоге скопировать и вставить «новую PageData ()» на каждый контроллер, который передает список опций в представление. Затем вы захотите удалить или добавить опцию и отредактировать PageData каждого контроллера.
Более того, вы хотите набрать наименьшее количество кода с наименьшим количеством ненужных подробных слов "add", "new", "IS" и "Name". Поскольку у вас есть только пара ключ-значение в опции выбора (и / или список переключателей), используйте самую легкую структуру данных, то есть словарь - в вашей модели.
Затем просто обратитесь к модели в контроллере и преобразуйте словарь в список выбора в представлении, используя DropDownListFor, содержащий лямбда-выражение LINQ.
запугивают? Ты не одинок. Я конечно был. Вот пример, который я использовал, чтобы научить себя M, V и C:
Модельная часть MVC:
using System.Web.Security;
using System.Collections.Generic;
using System.Text;
using System.Linq.Expressions;
using System.Web.Routing;
using System.Web.Helpers;
using System.Web.Mvc.Html;
using MvcHtmlHelpers;
using System.Linq;
// EzPL8.com is the company I work for, hence the namespace root.
// EzPL8 increases the brainwidths of waiters and bartenders by augmenting their "memories" with the identifies of customers by name and their food and drink preferences.
// This is pedagogical example of generating a select option display for a customer's egg preference.
namespace EzPL8.Models
{
public class MyEggs
{
public Dictionary<int, string> Egg { get; set; }
public MyEggs() //constructor
{
Egg = new Dictionary<int, string>()
{
{ 0, "No Preference"}, //show the complete egg menu to customers
{ 1, "I hate eggs"}, //Either offer an alternative to eggs or don't show eggs on a customer's personalized dynamically generated menu
//confirm with the customer if they want their eggs cooked their usual preferred way, i.e.
{ 2, "Over Easy"},
{ 3, "Sunny Side Up"},
{ 4, "Scrambled"},
{ 5, "Hard Boiled"},
{ 6, "Eggs Benedict"}
};
}
}
Контроллер теперь довольно прост, просто передавая модель. Это позволяет избежать создания изолированной концепции, которая, вероятно, не изолирована только одной страницей.
public ActionResult Index()
{
var model = new EzPL8.Models.MyEggs();
return View(model);
}
Представление использует DropDownListFor (вместо DropDownList) и требуется лямбда-выражение для строгой типизации при рефакторинге события:
@Html.DropDownListFor(m => m.Egg, new SelectList( Model.Egg, "Key", "Value"))
Вуаля, результирующий HTML:
<select id="Egg" name="Egg">
<option value="0">No Preference</option>
<option value="1">I hate eggs</option>
<option value="2">Over Easy</option>
<option value="3">Sunny Side Up</option>
<option value="4">Scrambled</option>
<option value="5">Hard Boiled</option>
<option value="6">Eggs Benedict</option>
</select>
Примечание: не запутайтесь в VALUE в <option value="6">
, который является ключом из словаря, из "Value" в SelectList (), который является текстом / заголовком (например, Eggs Benedict), который заканчивается вверх между тегами опций.
Вариант использования :
Чтобы минимизировать трафик между приложением и базой данных, я создал статический список, чтобы избежать запроса к базе данных для выпадающего списка, который редко, если вообще меняется. Однако изменения неизбежны, и через шесть месяцев умирает закусочная в ресторане моего клиента; не из-за зеленой ветчины, а потому, что у них была аллергия на яйца, и повар смешал их со своими вафлями.
Ресторан нуждается в обновлении информации о своих клиентах, чтобы сразу включить пищевую аллергию. Хотя они любят постоянных клиентов, они не в восторге от мертвых клиентов, которые возвращаются как зомби, у которых нет возможности заплатить, потому что их кредитные карты были аннулированы.
Риторический Вопрос: Должен ли я изменить все контроллеры и представления, связанные с предпочтениями клиента? Или просто вставить {7, "Аллергия на яйца"} в модель?
Еще один риторический вопрос: не яйца омлетов? Вы хотите добавить {8, "Omelette, Western"}, {9, "Omelette, Mushroom-Feta-Spinach"} один раз в модель, и чтобы новые добавления автоматически распространялись по всем раскрывающимся спискам во всех представлениях, которые их используют
Итог (ы) Это, вероятно, намного больше, чем вы просили, но вы сказали MVC, а не просто VC:
1. Используйте модель в * M * VC.
2. Используйте словарь в модели, когда список выбора основан не более чем на «первичном ключе» и заголовке.
3. Если ваш статический список не совпадает с таблицей поиска в базе данных, ваше приложение, вероятно, не очень полезно. Когда вы добавляете параметр в статический список, вам, скорее всего, потребуется также выполнить вставку в таблицу «Уточняющий запрос», чтобы избежать ошибки целостности отношения первичный ключ / внешний ключ с другими таблицами в базе данных.
4. Используйте лямбда и строго типизированные структуры данных, чтобы избежать ошибок и получить поддержку заголовков.