У меня есть приложение MVC, использующее различные конечные точки JsonResult
для заполнения javascript ViewModel.MVC pass JSON ViewModel для просмотра
Я использовал несколько запросов JQuery Ajax для заполнения модели, но мне бы хотелось, чтобы большая часть исходной модели передавалась в представление на сервере.
ViewModel имеет 3-5 частей (в зависимости от того, где пользователь находится в приложении):
- Основные ссылки страницы, они не меняются очень часто и может быть точно такой же на протяжении всей пользователя сессия
- Уведомления пользователей.
- Данные пользователя.
- (опционально) просмотры данные
- (опция) разные данные
В настоящее время я использую этот код, чтобы загрузить первые три частей:
$(document).ready(function() {
ko.applyBindings(viewModel);
@Html.Raw(ViewBag.Script)
// Piece 1. Almost always the same thing
postJSON('@Url.Action("HomeViewModelJson", "Home")', function (data) {
if (data == null)
return;
for (var i in data.Tabs) {
viewModel.tabs.push({ name: data.Tabs[i] });
}
for (var i in data.Buttons) {
viewModel.metroButtons.push({ name: data.MetroButtons[i] });
}
for (var i in data.Ribbons) {
viewModel.ribbons.push(data.Ribbons[i]);
}
ApplyButtonThemes();
});
});
// Piece 2. Changes constantly. OK as is
postJSON('@Url.Action("GetNotifications", "NotificationAsync")', function (nots) {
viewModel.notifications.removeAll();
ko.utils.arrayForEach(nots, function (item) {
item.readNotification = function() {
hub.markNotificationAsRead(this.Id);
return true;
};
viewModel.notifications.push(item);
});
});
// Piece 3. Changes but should also be loaded at startup
postJSON('@Url.Action("GetUser", "UserAsync")', function (user) {
viewModel.user(koifyObject(user));
});
postJSON = function(url, data, callback) {
if($.isFunction(data)) {
callback = data;
data = {};
}
$.ajax({
'type': 'POST',
'url': url,
'contentType': 'application/json',
'data': ko.toJSON(data),
'dataType': 'json',
'success': callback
});
};
Я пытался сделать что-то вроде этого, но я нахожу, что с помощью @Html.Action("HomeViewModelJson", "Home")
происходит изменение заголовков HTTP, и вся страница отправляется, как если бы она была JSON
(function (data) {
if (data == null)
return;
for (var i in data.Tabs) {
viewModel.tabs.push({ name: data.Tabs[i] });
}
for (var i in data.MetroButtons) {
viewModel.metroButtons.push({ name: data.MetroButtons[i] });
}
for (var i in data.Ribbons) {
viewModel.ribbons.push(data.Ribbons[i]);
}
ApplyMetroButtonThemes();
})('@Html.Action("HomeViewModelJson", "Home")');
Что я хотел бы сделать, это использовать существующие конечные точки JsonResult
, чтобы получить данные Json в моей ViewModel на стороне сервера, прежде чем страница будет отправлена пользователю.
Есть ли варианты, которые позволят мне сделать это без переписывания контроллеров?
Это звучит, как это могло бы работать! Позвольте мне попробовать: я даже не знал, что это возможно! –
Забыл принять. Отлично! –
+1 Ницца ............. – SleepyBoBos