Я пытаюсь определить правильный подход к заполнению нескольких выпадающих списков на странице просмотра приложения.net MVC, которое использует angularJS.
В моем приложении, разработанном как приложение для силосов SLA. Я использую угловой модуль ngRoute и $ routeProvider для описания нескольких страниц HTML для одной страницы CSHTML.
.config(function ($routeProvider, $locationProvider) {
$routeProvider.when('/club', { templateUrl: '/App/Club/Views/MCLView.html', controller: 'mclViewModel' });
$routeProvider.when('/club/list', { templateUrl: '/App/Club/Views/MCLView.html', controller: 'mclViewModel' });
$routeProvider.when('/club/show/:clubId', { templateUrl: '/App/Club/Views/ClubView.html', controller: 'clubViewModel' });
$routeProvider.otherwise({ redirectTo: '/club' });
$locationProvider.html5Mode(true);
});
Моя страница CSHTML в основном пуста, за исключением <div ng-view></div>
. Маршрутизированные HTML-страницы загружаются в div ng-view.
<div data-ng-app="club" id="club" data-ng-controller="rootViewModel">
<h2>{{ pageHeading }}</h2>
<div ng-view></div>
</div
Каждая страница просмотра html, загружаемая в ng-view, имеет соответствующий javascript-контроллер viewmodel.
Я начал заполнять первое раскрывающееся меню на странице html, используя $ http.get в угловом контроллере, чтобы получить данные списка (json) с вызова сервера. Затем выполните JSON.parse в файле result.data и заполните элемент управления списком выбора, который определен на странице html.
$scope.refreshColorsDropdown = function () {
var sel = document.getElementById('colorDropdown');
var colors = JSON.parse($scope.mycolors);
angular.forEach(colors, function(color) {
var opt = document.createElement('option');
opt.innerHTML = color.name;
opt.value = color.hex;
sel.appendChild(opt);
});
}
Я мог бы продолжить этот подход для каждого раскрывающегося списка на моей странице, создав несколько вызовов сервера, чтобы заполнить все мои выпадающие списки... но это кажется утомительным и тяжелым.
Будет ли разумный подход рассматривать построение одного вызова сервера, который возвращает несколько коллекций, по одному для каждого раскрывающегося списка, а затем я буду разбирать их, чтобы заполнить все выпадающие списки?
Я хотел бы предварительно заполнить списки на С# на стороне сервера, однако мои файлы cshtml пусты, за исключением div ng-view, поэтому там нет кодировки.
Итак, на мой вопрос... если мои HTML-представления содержат весь html-контент, а cshtml пустые... какую стратегию я должен использовать для заполнения нескольких элементов управления списком html со стороны сервера?
Используя MVC, вы можете создать ViewModel, который содержит все необходимые коллекции и вернуть эту коллекцию в ваш угловой контроллер. Ваша модель просмотра будет выглядеть примерно так:
public class MyViewModel
{
public List<ColorModel> Colors{get;set;}
public List<FabircModel> Fabrics {get;set;}
}
В вашем контроллере MVC:
MyViewModel mvm = new MyViewModel();
mvm.Colors = get colors here;
mvm.Fabrics = get fabrics here;
return Json(mvm, JsonRequestBehavior.AllowGet);
В вашем объекте успеха в Angular:
myservice.getData()
.success(function(data){
$scope.colors = data.Colors;
$scope.fabrics = data.Fabrics;
})
Надеюсь, это поможет или, по крайней мере, запустит вас.
Если вы проигнорируете тот факт, что используете углы, ответ будет состоять в том, чтобы заполнить модель представления тем, что вам нужно, и бритву cshtml, потому что вы используете угловое... ничего не меняется... потому что вы сказали, что SERVER-SIDE все еще ответ.
Если вы переместите это на клиент, то угловое обслуживание, которое может кэшировать данные, возможно, является самым прямым способом.