#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, вы должны:
- Создайте объект viewmodel
class ViewModel{ public List<Users> Users {get; set;} // whatever the name of your entity is }
- Заполните эту 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 } }
- В верхней части представления укажите тип объекта, который он получает:
@model ViewModel //use full path if it's not in the same scope
- Затем используйте свой список 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);
}