dotnode
Version:
.NET-like MVC framework for Node.js
154 lines (100 loc) • 3.84 kB
JavaScript
var ActionResult = require('../models/actionResult'),
resultTypes = require('../models/actionResultType'),
ViewEngine = require('../views/viewEngine'),
ViewOptions = require('../models/viewOptions'),
extend = require('xtend');
var Controller = function () {
};
// #region properties
Controller.prototype.pageOptions = {};
Controller.prototype.viewBag = {};
Controller.prototype.actions = {};
// #endregion
// #region private methods
// #endregion
// #region public methods
Controller.prototype.renderView = function (viewPath, model, renderLayout) {
var engine = this._viewEngine || new ViewEngine();
if (typeof renderLayout == 'undefined') {
renderLayout = false;
}
var renderingOptions = {
viewPath: viewPath,
model: model,
controllerContext: this.controllerContext,
viewOptions: {
writeToResponse: false,
renderLayout: renderLayout
}
};
var result = engine.render(renderingOptions);
return result;
};
Controller.prototype.view = function (viewName, model, options) {
var viewParams = this._getViewParams(arguments);
return new ActionResult(resultTypes.viewResult, viewParams);
};
Controller.prototype.json = function (object) {
return new ActionResult(resultTypes.jsonResult, {
object: object
});
};
Controller.prototype.writeJson = function (json) {
this.response.writeHead(200, { 'Content-Type': 'application/json' });
this.response.end(JSON.stringify(json));
};
Controller.prototype.writeView = function (viewPath, model, renderLayout) {
if(typeof renderLayout == 'undefined'){
renderLayout = true;
}
var htmlString = this.renderView(viewPath, model, renderLayout);
this.response.writeHead(200, { 'Content-Type': 'text/html' });
this.response.end(htmlString);
};
Controller.prototype.requestIsXhr = function () {
return this.request.headers["x-requested-with"] === 'XMLHttpRequest';
};
Controller.prototype.getControllerContext = function () {
this.controllerContext.pageOptions = this.pageOptions;
return this.controllerContext;
};
// #endregion
// #region private methods
Controller.prototype._getViewParams = function (args) {
var viewArgs = {
viewOptions: {}
};
// at least one argument must be defined
if (typeof args[0] != 'undefined') {
// if all arguments are defined, everthing is ok
if (typeof args[1] != 'undefined' && typeof args[2] != undefined) {
viewArgs.viewName = args[0];
viewArgs.model = args[1];
viewArgs.viewOptions = args[2];
return viewArgs;
}
// if only the first two arguments were passed, things get tricky...
if (typeof args[1] != 'undefined' && typeof args[2] == 'undefined') {
if (args[1] instanceof ViewOptions) {
viewArgs.viewName = this.controllerContext.actionName;
viewArgs.viewOptions = args[1];
viewArgs.model = args[0];
return viewArgs;
}
viewArgs.viewName = args[0];
viewArgs.model = args[1];
return viewArgs;
}
// if only the first argument was passed, then it is the model
if (typeof args[1] == 'undefined' && typeof args[2] == 'undefined') {
viewArgs.model = args[0];
viewArgs.viewName = this.controllerContext.actionName;
}
} else {
viewArgs.viewName = this.controllerContext.actionName;
viewArgs.model = null;
}
return viewArgs;
};
// #endregion
module.exports = Controller;