Как использовать локальную базу данных с шаблоном горячего полотенца SPA на ASP.NET MVC 4

Я, вероятно, самый неопытный человек в MVC, не говоря уже о Hot Towel SPA, но, тем не менее, я должен создать систему, основанную на этих технологиях.

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

Мне нужно построить панель инструментов с примерно 5 сетками на экране, отображающими данные в реальном времени, поскольку они поступают с некоторыми расчетами времени.

Все, что у меня есть за 2 дня, это измененный шаблон горячего полотенца, чтобы отобразить название моего проекта, и я изменил значок горячего полотенца. Я просто не могу уложиться в голове... В течение двух лет я был разработчиком веб-сайтов с трехуровневой архитектурой ASP.NET.

Может ли кто-нибудь дать мне рекомендации о том, как передавать данные через этот шаблон?


person Travis Stanley    schedule 06.03.2013    source источник
comment
Я нахожусь в той же лодке и чувствую то же, что и вы... Кажется, что теперь есть так много способов делать эти вещи, что трудно указать направление и двигаться вперед.   -  person Jason Stevenson    schedule 27.01.2014


Ответы (1)


Я начал с Hot Towel SPA, но использовал другие ссылки, такие как образец Durandal MovieApp, который вы можете найти здесь. http://stephenwalther.com/archive/2013/02/08/using-durandal-to-create-single-page-apps.aspx . Я также загрузил и проверил среду выполнения breezejs, которая включала образцы.

В моем сценарии я использовал SQL с Entity Frameworks, создал контроллер WEBAPI и следовал документации breezejs. кроме моего контроллера ниже.

 [BreezeController]
public class ProjectBillingController : ApiController
{
    readonly EFContextProvider<ProjectBillingContext> _contextProvider =
   new EFContextProvider<ProjectBillingContext>();

    // ~/api/todos/Metadata 
    [HttpGet]
    public string Metadata()
    {
        return _contextProvider.Metadata();
    }


    [HttpPost]
    public SaveResult SaveChanges(JObject saveBundle)
    {
        return _contextProvider.SaveChanges(saveBundle);
    }

    [HttpGet]
    public IQueryable<Client> Clients()
    {
        return _contextProvider.Context.Clients;
    }
    ...

Затем я попытался имитировать код и структуру каталогов приложения Durandal Movie.

/App 
/App/respositories 
/App/repositories/repository.js
/App/viewmodels 
/App/viewmodels/clients
/App/viewmodels/clients/show.js 
/App/viewmodels/clients/edit.js
/App/viewmodels/clients/create.js 
/App/views/clients
/App/views/clients/show.html 
/App/views/clients/edit.html
/App/views/clients/create.html

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

но внутри моего репозитория я поместил определенный менеджер сущностей breezejs и некоторые функции для извлечения всех строк и 1 строки. фрагмент кода ниже,

// repository.js
function getRecordLists(modelsListsObservable, errorObservable, entity) {

    return breeze.EntityQuery
    .from(entity)
    .using(manager).execute()
    .then(querySucceeded)
    .fail(queryFailed);

    function querySucceeded(data) {
        modelsListsObservable(data.results);
        logger.log('Fetched ' + entity, null, null, true);

    }

    function queryFailed(error) {
        errorObservable("Error retrieving" + entity + " : " + error.message);
        logger.error("Error retrieving" + entity + " : " + error.message, null, null, true);

    }
};


function getRecord(id, clientObservable, errorObservable, entity, entityKey) {
    return breeze.EntityQuery.from(entity)
    .where(entityKey, "==", id)
    .using(manager).execute()
    .then(querySucceeded)
    .fail(queryFailed);

    function querySucceeded(data) {
        clientObservable(data.results[0]);
        logger.log('Fetched a record from ' + entity, null, null, true);
    }

    function queryFailed(error) {
        errorObservable("Error retrieving a record from " + entity + ": " + error.message);
        logger.error("Error retrieving a record from " + entity + ": " + error.message, null, null, true);
    }

};

// show.js
define(function (require) {

    var repository = require("repositories/repository");
    var app = require('durandal/app');
    var router = require("durandal/plugins/router");
    var logger = require('services/logger');
    var models = ko.observableArray();
    var error = ko.observable();

    return {
        models: models,
        error: error,
        deleteRecord: deleteRecord,

        activate: function (data) {
            return repository.getRecordLists(models, error, "Resources");
        }
    };

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

Спасибо

person Ed Mendez    schedule 07.03.2013
comment
Спасибо за это, на этой неделе я бегал как безголовый цыпленок, но я выделил понедельник, чтобы взглянуть на это, и я дам вам знать, как это происходит. - person Travis Stanley; 08.03.2013