Как скрыть мое меню для не аутентифицируемые пользователи?

type и id_in_type дизайн называют Полиморфные Ассоциации . Этот дизайн нарушает правила нормализации несколькими способами. Если ничто иное, это должен быть красный флаг, что Вы не можете объявлять реальное ограничение внешнего ключа, потому что эти id_in_type может сослаться на любую из нескольких таблиц.

Вот лучший способ определить Ваши таблицы:

  • Делают абстрактную таблицу Vehicles для обеспечения абстрактной контрольной точки для всех подтипов механизма и тестов механизма.
  • Каждый подтип механизма имеет первичный ключ, который не делает автоинкремента, но вместо этого ссылок Vehicles.
  • Каждый тестовый подтип имеет первичный ключ, который не делает автоинкремента, но вместо этого ссылок Tests.
  • Каждый тестовый подтип также имеет внешний ключ к соответствующему подтипу механизма.

Вот демонстрационный DDL:

CREATE TABLE Vehicles (
 vehicle_id INT AUTO_INCREMENT PRIMARY KEY
);

CREATE TABLE Speedboats (
 vehicle_id INT PRIMARY KEY,
 col_about_speedboats_but_not_tests1 INT,
 col_about_speedboats_but_not_tests2 INT,
 FOREIGN KEY(vehicle_id) REFERENCES Vehicles(vehicle_id)
);

CREATE TABLE Cars (
 vehicle_id INT PRIMARY KEY,
 col_about_cars_but_not_tests1 INT,
 col_about_cars_but_not_tests2 INT,
 FOREIGN KEY(vehicle_id) REFERENCES Vehicles(vehicle_id)
);

CREATE TABLE Gokarts (
 vehicle_id INT PRIMARY KEY,
 col_about_gokarts_but_not_tests1 INT,
 col_about_gokarts_but_not_tests2 INT,
 FOREIGN KEY(vehicle_id) REFERENCES Vehicles(vehicle_id)
);

CREATE TABLE Tests (
 test_id INT AUTO_INCREMENT PRIMARY KEY,
 col_about_all_tests1 INT,
 col_about_all_tests2 INT
);

CREATE TABLE SpeedboatTests (
 test_id INT PRIMARY KEY,
 vehicle_id INT NOT NULL,
 col_about_speedboat_tests1 INT,
 col_about_speedboat_tests2 INT,
 FOREIGN KEY(test_id) REFERENCES Tests(test_id),
 FOREIGN KEY(vehicle_id) REFERENCES Speedboats(vehicle_id)
);

CREATE TABLE CarTests (
 test_id INT PRIMARY KEY,
 vehicle_id INT NOT NULL,
 col_about_car_tests1 INT,
 col_about_car_tests2 INT,
 FOREIGN KEY(test_id) REFERENCES Tests(test_id),
 FOREIGN KEY(vehicle_id) REFERENCES Cars(vehicle_id)
);

CREATE TABLE GokartTests (
 test_id INT PRIMARY KEY,
 vehicle_id INT NOT NULL,
 col_about_gokart_tests1 INT,
 col_about_gokart_tests2 INT,
 FOREIGN KEY(test_id) REFERENCES Tests(test_id),
 FOREIGN KEY(vehicle_id) REFERENCES Gokarts(vehicle_id)
);

Вы могли альтернативно объявить Tests.vehicle_id, какие ссылки Vehicles.vehicle_id и избавляются от vehicle_id внешних ключей в каждой тестовой таблице подтипа, но это разрешило бы аномалии, такие как тест быстроходного катера, который ссылается на идентификатор gokart.

7
задан MCardinale 21 August 2009 в 15:03
поделиться

4 ответа

if (Request.IsAuthenticated)

(Вот как это делается в шаблоне ASP.NET MVC по умолчанию)

20
ответ дан 6 December 2019 в 06:50
поделиться

Я использую:

<% if( HttpContext.Current.User.Identity.IsAuthenticated ) %>

или

<% if( HttpContext.Current.User.Identity.IsInRole("roleName") ) %>

, но другие ответы выглядят так, как будто они тоже будут работать нормально.

1
ответ дан 6 December 2019 в 06:50
поделиться

if (Request.IsAuthenticated)

Пример этого есть в элементе управления входа в систему базового проекта mvc.

если вам нужны роли, то

if (HttpContext. Current.User.IsInRole ("myrole"))

4
ответ дан 6 December 2019 в 06:50
поделиться

Думаю, вы захотите использовать:

<% if(this.User.Identity.IsAuthenticated) { %>
<% } %>
1
ответ дан 6 December 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: