Вы можете ввести свой пароль в полном порядке. Введите пароль и нажмите ввод. Интерфейс командной строки в MacOS (и большинство других командных строк) не отображает звездочки (*) при вводе пароля (как и следовало ожидать), и вместо этого кажется, что вы ничего не печатаете.
Вы должны написать отдельный контроллер для каждой сущности, чтобы четко разделить задачи для ваших классов контроллеров. Если у вас только один контроллер, тогда у вас будет только одна директория Views с десятками представлений, и ваш контроллер будет содержать десятки методов, которые скоро станут неуправляемыми.
Я бы просто создал новый веб-сайт MVC, который будет заниматься администрацией. У вас есть более гибкое решение, если вы разделяете данные и бизнес-логику в разных сборках. Затем вы можете опубликовать свой сайт на поддомене, например, admin.yoursite.com. Таким образом, вам не нужно связываться с вашими маршрутами, и вы можете держать их в отдельных представлениях, что является наиболее элегантным решением imho. Про и Кон было бы приятно услышать.
Я работаю над проектом, который будет нуждаться в том же сайте администрирования, но пока не зашел так далеко, поэтому этот вопрос меня очень интересует.
Предлагаю использовать это решение .
Но я изменил определение на это:
public ThemedViewEngine()
{
base.MasterLocationFormats = new string[] {
"~/Views/{1}/{0}.master",
"~/Views/Shared/{0}.master",
"~/Themes/{2}/Views/{1}/{0}.master",
"~/Themes/{2}/Views/Shared/{0}.master",
"~/Themes/Default/Views/{1}/{0}.master",
"~/Themes/Default/Views/Shared/{0}.master"
};
base.ViewLocationFormats = new string[] {
"~/Views/{1}/{0}.aspx",
"~/Views/{1}/{0}.ascx",
"~/Views/Shared/{0}.aspx",
"~/Views/Shared/{0}.ascx",
"~/Themes/{2}/Views/{1}/{0}.aspx",
"~/Themes/{2}/Views/{1}/{0}.ascx",
"~/Themes/{2}/Views/Shared/{0}.aspx",
"~/Themes/{2}/Views/Shared/{0}.ascx",
"~/Themes/Default/Views/{1}/{0}.aspx",
"~/Themes/Default/Views/{1}/{0}.ascx",
"~/Themes/Default/Views/Shared/{0}.aspx",
"~/Themes/Default/Views/Shared/{0}.ascx"
};
base.PartialViewLocationFormats = new string[] {
"~/Views/{1}/{0}.aspx",
"~/Views/{1}/{0}.ascx",
"~/Views/Shared/{0}.aspx",
"~/Views/Shared/{0}.ascx",
"~/Themes/{2}/Views/{1}/{0}.aspx",
"~/Themes/{2}/Views/{1}/{0}.ascx",
"~/Themes/{2}/Views/Shared/{0}.aspx",
"~/Themes/{2}/Views/Shared/{0}.ascx",
"~/Themes/Default/Views/{1}/{0}.aspx",
"~/Themes/Default/Views/{1}/{0}.ascx",
"~/Themes/Default/Views/Shared/{0}.aspx",
"~/Themes/Default/Views/Shared/{0}.ascx"
};
}
Тема по умолчанию - это тема по умолчанию, поэтому она должна существовать.
Структура каталога будет такой:
Ответ зависит от того, насколько функциональными будут контроллеры. Просто начните с одного контроллера, а если его станет слишком много, разделите его на несколько. Самое замечательное в MVC - это то, что вы помещаете вещи в свои контроллеры, и это не должно влиять на URL-адреса. вы можете очень легко сопоставить / Users / Create, например, с классом UserAdminController.
Для этого можно использовать DynamicData . Это не MVC, но его можно использовать вместе с ним, и его действительно легко настроить и использовать.
Как обсуждает Мэтью Уилсон в Imperfect C ++ , это можно использовать для обеспечения безопасности типов в C ++, предотвращая использование DIMENSION_OF ()
-подобных макросы с экземплярами типов, которые определяют оператор нижнего индекса, например:
#define DIMENSION_OF_UNSAFE(x) (sizeof(x) / sizeof((x)[0]))
#define DIMENSION_OF_SAFER(x) (sizeof(x) / sizeof(0[(x)]))
int ints[4];
DIMENSION_OF_UNSAFE(ints); // 4
DIMENSION_OF_SAFER(ints); // 4
std::vector v(4);
DIMENSION_OF_UNSAFE(v); // gives impl-defined value; v likely wrong
DIMENSION_OF_SAFER(v); // does not compile
Здесь есть еще кое-что, для работы с указателями, но это требует некоторых дополнительных умений шаблона. Ознакомьтесь с реализацией STLSOFT_NUM_ELEMENTS ()
в библиотеках STLSoft и прочтите обо всем этом в главе 14 Imperfect C ++ .
edit: some of комментаторы предполагают, что реализация не отклоняет указатели. Он работает (как и пользовательские типы), как показано в следующей программе. Вы можете проверить это по раскомментированным строкам 16 и 18. (я только что сделал это на Mac / GCC4, и он отклоняет обе формы). It works pretty well with only the Administration Controller (/Administration/CreateUser/id)... but it becomes a big mess when I use different controller as User or Article (/User/DeleteUser/id or /Article/Details/id).
I'd prefer to use one controller per entity, but I can't find a way to bond this approach with multiple controllers.
В настоящее время я использую ASP.NET для большого клиента.
Подход, который я принял, заключается в том, чтобы передать функциональность действия другому классу.
Пример
Я также пишу административный раздел. Будет один контроллер администрирования (у нас небольшой административный раздел, если бы он был больше, я бы изменил маршрутизацию, чтобы разрешить больше контроллеров, пока мы используем готовую конфигурацию). Если я создам представление «EditUser». Я также создам класс EditUserAction . Весь код EditUser войдет в класс. Я создаю класс EditUserAction в классе контроллера администрирования в методе Edit User. Это удаляет весь код конкретного действия из класса Controller. Таким образом, весь код конкретного действия находится либо в методе действия, либо в классе действия. В противном случае контроллер быстро переполнится кодом от различных действий. Класс контроллера за короткое время превратился бы в неуправляемый беспорядок.
Примеры классов
public class Administration: Controller
{
public ActionResult EditUser(string userId)
{
EditUserAction action = new EditUserAction();
}
}
public class EditUserAction
{
public void Save(User user)
{
//save code here
}
}
Я надеюсь, что это объяснение понятно. Если этого не произойдет, дайте мне знать, и я поясню.
На ответьте на ваш вопрос, я делаю это вторым ( / Administration / CreateUser / id или / Administration /DeletePost/id).