Доступ к объектам базы данных в поле зрения Asp.Net MVC

#c# #asp.net-mvc #model-view-controller

#c# #asp.net-mvc #модель-представление-контроллер

Вопрос:

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

Вид

 @using proName.Models
@{
        proNameEntities DB = new proNameEntities();
}

<div class"">
@{
   int conID;
   var UserExist = DB.Users.Where(x => x.UserID =conID).FirstOrDefault();

   if (UserExist != null)
   {
    <p>@UserExist.name</p>
   }

 }
</div>
 

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

1. Вы должны выполнять загрузку объектов из вашего контроллера / введенного класса в ваш контроллер… Ваше представление должно быть облегченным / отображать только логику…

Ответ №1:

Это неверно, поскольку нарушает MVC (относится к Model-View-Controller ).

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

Кроме того, вы отменили роль ViewModel

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

1. согласен с вами, но нужно знать одну вещь, которая является проблемой безопасности или нет?

2. При публикации представления копируются как есть, в то время как контроллеры компилируются в библиотеки dll. Таким образом, код можно увидеть. Этого следует избегать, особенно если ваша база данных содержит какой-либо пароль или строку подключения.

Ответ №2:

Чтобы следовать шаблону MVC, вы должны:

  1. Создайте объект viewmodel
     class ViewModel{
        public List<Users> Users {get; set;} // whatever the name of your entity is
    }
     
  2. Заполните эту ViewModel своим списком со стороны контроллера:
     public class HomeController : Controller {
    
        proNameEntities DB = new proNameEntities();   //initalise db entities here        
    
        public ActionResult Index(){
            ViewModel vm = new ViewModel();
            vm.Users = this.DB.Users
            return View(vm); // pass the viewmodel object to the view
        }
    }
     
  3. В верхней части представления укажите тип объекта, который он получает:
     @model ViewModel //use full path if it's not in the same scope
     
  4. Затем используйте свой список viewmodels в представлении:
     @{
      foreach (user in Users){
           //do something
      }
    }
     

В идеале вы также хотели бы использовать эту логику UserExist внутри вашего контроллера. Итак, создайте новое свойство в viewmodel, выполните проверку с помощью контроллера, затем вставьте данные в объект ViewModel и передайте их в представление.

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

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

2. Я не совсем понимаю ваш комментарий полностью, но, похоже, это может быть достигнуто с помощью частичных представлений и наследования viewmodel.. краткое объяснение: у вас есть дочерние модели представления и база.. Таким образом, ваше частичное представление использует контроллер, который передает дочернюю viewmodel, поэтому ваша проверка UserExist выполняется каждый раз, и дочерняя viewmodel по-прежнему работает с родительским представлением, поскольку оно наследуется от базовой Viewmodel.. таким образом, все типы согласованы

Ответ №3:

это неверно и не рекомендуется

Коды, относящиеся к серверной части, должны быть записаны в контроллере (также рекомендуется Microsoft)

напишите код в контроллере, затем передайте результат по модели для просмотра

Ответ №4:

Вместо того, чтобы помещать свой бизнес-код / код базы данных в представление (M V C), вы должны вводить данные представления в действие. как показано ниже кода:

 public ActionResult Index()
{
    var conID = 1; //BASED ON DATA-INPUT
    var userExists = DB.Users.Where(x => x.UserID = conID).FirstOrDefault();
    return View(userExists?.Name);
}