We suggest the following:

  1. Getting Started to spare a long time !
    Innovacall ASP.net MVC4 Framework can be the base of any MVC Project, follow those instructions to start (10 minutes if your Visual Studio is MVC4 Ready and your SQL Server 2008R2 already installed). Send your feedback about intalling and starting your project Dont forget to install Emit mapper and Log4Net !
  2. Wait for french and english video tutorials
    Comming soon !
  3. We can host your project for free !
    If you use our Framework, we can host your project for free (if your project size and resources needs are raisonnables).
  4. Become a contributor !
    Contact me to become a contributor (Visual Studio Pro or better and Codeplex account required)

I sincerly hope, you will enjoy...

Laurent Jordi

Involved code
  • View
  • Layout
  • Controller
  • Model
  • View JS
  • Layout JS
  • Script G View
  • View Generated JS
   1:  @using InnovaApp.Layers.ResourcesLayer.Properties
   2:  @model InnovaApp.Portals.MVC4Portal.Models.HomeModel
   3:  @section featured {
   4:     <section class="featured">
   5:        <div class="content-wrapper">
   6:           <hgroup class="title">
   7:              <h1>@Model._PageTitle</h1>
   8:              <h2>@Model._PageMessage</h2>
   9:           </hgroup>
  10:           <p class="redText">
  11:              Warning, I removed Authorize decoration in controllers to let Search Engine to reference pages. In your code you have to add Athorize decoration in private pages.
  12:           </p>
  13:           <p>
  14:              To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">
  15:                 http://asp.net/mvc</a>. The page features
  16:              <mark>videos, tutorials,
  17:                          and samples</mark>
  18:              to help you get the most from ASP.NET MVC. If you have any questions about ASP.NET
  19:              MVC visit <a href="http://forums.asp.net/1146.aspx/1?MVC" title="ASP.NET MVC Forum">
  20:                 ASP.NET MVC Forum</a>.
  21:           </p>
  22:        </div>
  23:     </section>
  24:  }
  25:  <h3>
  26:     We suggest the following:</h3>
  27:  <ol class="round">
  28:     <li class="one">
  29:        <h5>
  30:           Getting Started to spare a long time !</h5>
  31:        Innovacall ASP.net MVC4 Framework can be the base of any MVC Project, follow <a href="http://innovacallframework.codeplex.com/wikipage?title=How%20to%20use%20Innova%20Framework%20%28easy%20for%20MCV%203%20or%204%20Developpers%2c%20a%20video%20will%20be%20availlable%20soon%29&version=1">
  32:           those instructions</a> to start (10 minutes if your Visual Studio is MVC4 Ready
  33:        and your SQL Server 2008R2 already installed). <a href="mailto:frameworkinstallfeedback@innovacall.com">
  34:           Send your feedback about intalling and starting your project</a> Dont forget
  35:        to install Emit mapper and Log4Net ! </li>
  36:     <li class="two">
  37:        <h5>
  38:           Wait for french and english video tutorials</h5>
  39:        Comming soon ! </li>
  40:     <li class="three">
  41:        <h5>
  42:           We can host your project for free !</h5>
  43:        If you use our Framework, we can host your project for free (if your project size
  44:        and resources needs are raisonnables).</li>
  45:     <li class="four">
  46:        <h5>
  47:           Become a contributor !</h5>
  48:        <a href="mailto:contributeframework@innovacall.com">Contact me to become a contributor</a>
  49:        (<a href="http://www.microsoft.com/visualstudio/en-us" target="_blank">Visual Studio
  50:           Pro</a> or better and <a href="https://www.codeplex.com/site/register?associate=None"
  51:              target="_blank">Codeplex account required)</a> </li>
  52:  </ol>
  53:  <p>
  54:  I sincerly hope, you will enjoy...
  55:  </p>
  56:  <p>
  57:  Laurent Jordi
  58:  </p>
  59:   
  60:  @if (Model.InvolvedCode != null)
  61:  {
  62:      if (Model.InvolvedCode.Count > 0)
  63:      { 
  64:      <section>
  65:          <span class="involvedCode">@Resources.Views_All_InvolvedCode</span>
  66:          <div id="divInvolvedCode">
  67:              @Html.Partial("_InvolvedCode", Model.InvolvedCode)
  68:          </div>
  69:      </section>
  70:      }
  71:  }
   1:  @using INNOVACALL.Framework.Common
   2:  @using InnovaApp.Layers.ResourcesLayer.Properties
   3:  @{
   4:     InnovaApp.Layers.CommonLayer.Models._Models_Base layoutModel = (InnovaApp.Layers.CommonLayer.Models._Models_Base)Model;
   5:  }
   6:  <!DOCTYPE html>
   7:  <html lang="en">
   8:  <head>
   9:      <meta charset="utf-8" />
  10:      <meta name="viewport" content="width=device-width" />
  11:      @foreach (var item in layoutModel._Meta)
  12:      { 
  13:          <meta name="@item.Key.ToString()" content="@item.Value" />
  14:      }
  15:      <title>@layoutModel._PageTitle</title>
  16:      <link href="@Url.Content("~/CSSG/Site.css")" rel="stylesheet" type="text/css" />
  17:      <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
  18:      @Scripts.Render("~/bundles/modernizr")
  19:      @if (layoutModel._SpecificCSS != null)
  20:      {
  21:          foreach (var cssReference in layoutModel._SpecificCSS)
  22:          { 
  23:          <link href="@Url.Content("~/Content/" + cssReference)" rel="stylesheet" type="text/css" />
  24:          }
  25:      }
  26:      @if (layoutModel._ExternalCSS != null)
  27:      {
  28:          foreach (var cssReference in layoutModel._ExternalCSS)
  29:          { 
  30:          <link href="@cssReference" rel="stylesheet" type="text/css" />
  31:          }
  32:      }
  33:      @foreach (var jsReference in layoutModel._SpecificJS)
  34:      { 
  35:          <script src="@Url.Content("~/Scripts/" + jsReference)" type="text/javascript"></script>
  36:      }
  37:  </head>
  38:  <body>
  39:      <div class="content-wrapper full-height page shadow">
  40:          <header>
  41:              <div class="content-wrapper">
  42:                  <div class="float-left">
  43:                      <a href="/" title="Home">
  44:                          <img src="../../Images/LogoInnovacall.png" alt="Innovacall MVC Framework" class="LogoInnovacall" />
  45:                          <img src="../../Images/ASPNetOpenSourceFramework.png" alt="Innovacall ASP.net Open Source Framework"
  46:                              class="LogoInnovacallMVCFramework" />
  47:                      </a>
  48:                  </div>
  49:                  <div class="float-right">
  50:                      <section id="login">
  51:                          @Html.Partial("_LoginPartial")
  52:                      </section>
  53:                      <a href="http://www.microsoft.com/bizspark/" title="Microsoft Bizspark" target="_blank">
  54:                          <img src="../../Images/BizSpark_Alumini.png" alt="Innovacall ASP.net Open Source Framework"
  55:                              class="MicrosoftBizSparkAlumini" />
  56:                      </a>
  57:                  </div>
  58:              </div>
  59:          </header>
  60:          <div id="body" class="content-wrapper rounded">
  61:              @if (layoutModel._DisplayMenus)
  62:              { 
  63:                  <nav class="content-wrapper k-content">
  64:                      @Html.Partial("_MenuBar", layoutModel)
  65:                  </nav>
  66:              }
  67:              @RenderSection("featured", required: false)
  68:              <section class="content-wrapper main-content clear-fix">
  69:                  @RenderBody()
  70:              </section>
  71:          </div>
  72:          <footer>
  73:              <div class="content-wrapper">
  74:                  <table class="tblFooter">
  75:                      <tr>
  76:                          <td class="tdCopyright">
  77:                              &copy; @DateTime.Now.Year - Innovacall
  78:                          </td>
  79:                          <td class="tdCodeplex">
  80:                              source code : <a href="http://innovacallframework.codeplex.com" target="_blank">http://innovacallframework.codeplex.com</a>
  81:                          </td>
  82:                          <td class="tdContactUs">
  83:                              <a href="mailto:innovacallframework@innovacall.com">Contact us</a>
  84:                          </td>
  85:                      </tr>
  86:                  </table>
  87:              </div>
  88:          </footer>
  89:      </div>
  90:      <!--KendoUI Add-->
  91:      <style scoped>
  92:          #customValue
  93:          {
  94:              line-height: 16px;
  95:              width: 60px;
  96:              float: none;
  97:              margin: -3px 0 0 5px;
  98:          }
  99:      </style>
 100:      <!--/KendoUI Add-->
 101:      <div id="dialogMessage">
 102:      </div>
 103:  </body>
 104:  <script src="/Scripts/InnovacallJS/_Layout/_Layout.js" type="text/javascript"></script>
 105:  @if (layoutModel._SpecificJqueryJS != null)
 106:  {
 107:      foreach (var specificJqueryJSReference in layoutModel._SpecificJqueryJS)
 108:      {
 109:          string prefix = string.Empty;
 110:          if (!specificJqueryJSReference.StartsWith("http"))
 111:          {
 112:              prefix = "~/Scripts/";
 113:          }
 114:      <script src="@Url.Content(prefix + specificJqueryJSReference)" type="text/javascript"></script>
 115:      }
 116:  }
 117:  @if (layoutModel._DynamicJqueryJS != null)
 118:  {
 119:      foreach (var dynamicJqueryJS in layoutModel._DynamicJqueryJS)
 120:      { 
 121:      <script src="@Url.Content("~" + dynamicJqueryJS)" type="text/javascript"></script>
 122:      }
 123:  }
 124:  <script type="text/javascript">
 125:  @{
 126:      foreach (string variable in layoutModel._JSVariables)
 127:      {
 128:     @Html.Raw(variable);
 129:      }
 130:  }
 131:        $(document).ready(function () {
 132:        $.fn.DocReady();
 133:     });
 134:  </script>
 135:  </html>
   1:  using System.Web.Mvc;
   2:  using InnovaApp.Layers.DataLayer;
   3:  using InnovaApp.Layers.ResourcesLayer.Properties;
   4:  using InnovaApp.Portals.MVC4Portal.Models;
   5:  using INNOVACALL.Framework.Common;
   6:  using INNOVACALL.Framework.Common.CodeFormatting;
   7:  using INNOVACALL.Framework.Common.Models;
   8:  using INNOVACALL.Framework.Common.MVCHelpers;
   9:  using System;
  10:   
  11:  namespace InnovaApp.Portals.MVC4Portal.Controllers
  12:  {
  13:      public class HomeController : _Controllers_Base<HomeModel>
  14:      {
  15:          protected override void Initialize(System.Web.Routing.RequestContext requestContext)
  16:          {
  17:              base.eMethodBase = "InnovaApp.Portals.InnovaAppFrontOfficePortal.Controllers.HomeController";
  18:              base.specificCssCollection = new string[] { "_FormCommon.css", "Views/Home.css", "ClientComponents/CodeFormatting/csharp.css", "ClientComponents/KendoUI/kendo.common.min.css", "ClientComponents/KendoUI/kendo.blueopal.min.css" };
  19:              base.specificJSCollection = null;
  20:              base.dynamicJSCollection = new string[] { "/ScriptsG/inoHomeDynamic.js" };
  21:              base.specificJqueryJSCollection = new string[] { "ClientComponents/KendoUI/kendo.web.min.js", "InnovacallJS/Home/Home.js" };
  22:              base.externalCSS = null;
  23:              base.Meta.Add(enMeta.Description, Resources.View_Home_Meta_Description);
  24:              base.Meta.Add(enMeta.Keywords, Resources.View_Home_OrderWithDetails_Meta_Keywords);
  25:              base.Meta.Add(enMeta.Subject, Resources.View_Home_OrderWithDetails_Meta_Subject);
  26:   
  27:              base.Initialize(requestContext);
  28:          }
  29:   
  30:          [HttpGet, CacheManager(enCacheMode.NoCache)] //Manage your cache
  31:          public ActionResult Index()
  32:          {
  33:              //NEVER USES VIEW BAG AGAIN !
  34:              //ViewBag.Message = "Modify this template to kick-start your ASP.NET MVC application.";
  35:              using (DataRepositories _dataContext = new DataRepositories())
  36:              {
  37:                  base.InitView(
  38:                      Resources.View_Home_PageTitle,
  39:                      string.Empty,
  40:                      specificCssCollection,
  41:                      specificJSCollection,
  42:                      dynamicJSCollection,
  43:                      specificJqueryJSCollection,
  44:                      jsVariables,
  45:                      externalCSS,
  46:                      Meta,
  47:                      _dataContext,
  48:                      true);
  49:              }
  50:   
  51:   
  52:              ContentData.InvolvedCode = new InvolvedCodeModel();
  53:              ContentData.InvolvedCode.Add(new INNOVACALL.Framework.Common.Models.MetaModels.CodeFile_MetaModel() { Language = enCodeLanguage.Html, TabStripName = "View", TabStripContent = "/Views/Home/Index.cshtml" });
  54:              ContentData.InvolvedCode.Add(new INNOVACALL.Framework.Common.Models.MetaModels.CodeFile_MetaModel() { Language = enCodeLanguage.Html, TabStripName = "Layout", TabStripContent = "/Views/Shared/_Layout.cshtml" });
  55:              ContentData.InvolvedCode.Add(new INNOVACALL.Framework.Common.Models.MetaModels.CodeFile_MetaModel() { Language = enCodeLanguage.cSharp, TabStripName = "Controller", TabStripContent = "/Controllers/HomeController.cs" });
  56:              ContentData.InvolvedCode.Add(new INNOVACALL.Framework.Common.Models.MetaModels.CodeFile_MetaModel() { Language = enCodeLanguage.cSharp, TabStripName = "Model", TabStripContent = "/Models/HomeModel.cs" });
  57:              ContentData.InvolvedCode.Add(new INNOVACALL.Framework.Common.Models.MetaModels.CodeFile_MetaModel() { Language = enCodeLanguage.Javascript, TabStripName = "View JS", TabStripContent = "/Scripts/InnovacallJS/Home/Home.js" });
  58:              ContentData.InvolvedCode.Add(new INNOVACALL.Framework.Common.Models.MetaModels.CodeFile_MetaModel() { Language = enCodeLanguage.Javascript, TabStripName = "Layout JS", TabStripContent = "/Scripts/InnovacallJS/_Layout/_Layout.js" });
  59:              ContentData.InvolvedCode.Add(new INNOVACALL.Framework.Common.Models.MetaModels.CodeFile_MetaModel() { Language = enCodeLanguage.Html, TabStripName = "Script G View", TabStripContent = "/Views/ScriptsG/inoHomeDynamic.cshtml" });
  60:              ContentData.InvolvedCode.Add(new INNOVACALL.Framework.Common.Models.MetaModels.CodeFile_MetaModel() { Language = enCodeLanguage.GeneratedJavascript, TabStripName = "View Generated JS", TabStripContent = "/ScriptsG/inoHomeDynamic.js" });
  61:              RenderCodeFiles(ContentData.InvolvedCode);
  62:   
  63:              return View(ContentData);
  64:          }
  65:      }
  66:  }
   1:  using INNOVACALL.Framework.Common.Models;
   2:   
   3:  namespace InnovaApp.Portals.MVC4Portal.Models
   4:  {
   5:     public class HomeModel : _Models_Base
   6:     {
   7:        public InvolvedCodeModel InvolvedCode { get; set; }
   8:   
   9:        public HomeModel()
  10:        {
  11:           this.InvolvedCode = null;
  12:        }
  13:     }
  14:  }
   1:  //INNOVACALL FRAMEWORK MUST BE IN ALL VIEW JAVASCRIPT
   2:  $.fn.DocReady = function () {
   3:     $.fn.PrepareLayoutMenus();
   4:     $.fn.TabifyCodeFiles();
   5:     //Add call to execute when document is ready
   6:  }
   7:   
   8:  $.fn.MainAjaxSuccess = function (a, b, c) {
   9:     if (a.ScriptToExecute != null) {
  10:        eval(a);
  11:     }
  12:  }
   1:  $.fn.kendoMenuOpenFixup = function (e) {
   2:      var evt = e;
   3:  }
   4:   
   5:  $.fn.PrepareLayoutMenus = function () {
   6:      $("#layoutMenu").kendoMenu({
   7:          open: $.fn.kendoMenuOpenFixup
   8:      });
   9:  }
  10:   
  11:  //------------------Ouvre la dialogBox----------------
  12:  $.fn.jqDialog = function (idDiv, titre, redirection) {
  13:      var dialogBox = $(idDiv);
  14:      $(dialogBox).hide();
  15:      $(dialogBox).dialog({
  16:          title: titre,
  17:          autoOpen: false,
  18:          resizable: false,
  19:          modal: true,
  20:          minHeight: 450,
  21:          minWidth: 800,
  22:          buttons: [
  23:           {
  24:               text: "Ok",
  25:               click: function () {
  26:                   if (redirection != null) {
  27:                       $.fn.NavigateTo(redirection);
  28:                   }
  29:                   $(this).dialog("close");
  30:               }
  31:           }
  32:        ],
  33:          open: function (event, ui) { }
  34:      });
  35:  };
  36:  //------------------Appel l'ouverture de la dialogBox----------------
  37:  $.fn.jqDialogConfirm = function (title, message, confirmButtonTitle, cancelButtonTitle, okFunction) {
  38:      var dialogBox = $('#dialogMessage');
  39:      dialogBox.text(message);
  40:      $(dialogBox).hide();
  41:      $(dialogBox).dialog({
  42:          title: title,
  43:          autoOpen: false,
  44:          resizable: false,
  45:          modal: true,
  46:          minHeight: 200,
  47:          minWidth: 350,
  48:          buttons: [
  49:           {
  50:               text: confirmButtonTitle,
  51:               click: okFunction
  52:           }
  53:              ,
  54:              {
  55:                  text: cancelButtonTitle,
  56:                  click: function () { $('#dialogMessage').dialog('close'); }
  57:              }
  58:        ]
  59:      });
  60:      $('#dialogMessage').dialog('open');
  61:  }
  62:  //------------------Appel l'ouverture de la dialogBox----------------
  63:  $.fn.jqDialogMessageOpen = function () {
  64:      $.fn.jqDialog('#dialogMessage', 'Alerte Erreur');
  65:      $('#dialogMessage').dialog('open');
  66:  }
  67:  //------------------Appel l'ouverture de la dialogBox----------------
  68:  $.fn.jqDialogAlert = function (title, message, redirection) {
  69:      $.fn.jqDialog('#dialogMessage', title, redirection);
  70:      $('.ui-dialog-content').text(message);
  71:      $('#dialogMessage').dialog('open');
  72:  }
  73:  //------------------Appel l'ouverture de la dialogBox pour une erreur----------------
  74:  $.fn.jqDialogErreur = function (divErreur, exception) {
  75:      $.fn.jqDialog("#dialogErreur", "Alerte Pop-Up");
  76:      $('.ui-dialog-title').fadeIn().text('Alerte Erreur');
  77:      $('.ui-dialog-content').fadeIn().text('Message d\'erreur : ' + exception);
  78:  };
  79:  //------------------Appel de la fonction jqDialogErreur en lui passant le nom du div----------------
  80:  $.fn.jqDialogErreurOpen = function (exception) {
  81:      var divErreur = '#GestionErreur';
  82:      $.fn.jqDialogErreur(divErreur, exception);
  83:      $(divErreur).dialog('open');
  84:  };
  85:  //------------------Serialise les objets d'une form----------------
  86:  $.fn.serializeObject = function () {
  87:      var obj = {};
  88:      $(":input[type='checkbox']").each(function (e) {
  89:          obj[this.name] = this.checked;
  90:      });
  91:      var o = {};
  92:      var a = this.serializeArray();
  93:      $.each(a, function () {
  94:          if (o[this.name] !== undefined) {
  95:              if (obj !== undefined) {
  96:                  if (obj[this.name] !== undefined) {
  97:                      o[this.name] = obj[this.name];
  98:                  }
  99:              }
 100:              else {
 101:                  if (!o[this.name].push) {
 102:                      o[this.name] = [o[this.name]];
 103:                  }
 104:                  o[this.name].push(this.value || '');
 105:              }
 106:          }
 107:          else {
 108:              o[this.name] = this.value || '';
 109:          }
 110:      });
 111:      return o;
 112:  };
 113:  //------------------Navigate to the url----------------
 114:  $.fn.NavigateTo = function (url) {
 115:      window.location.href = url;
 116:  }
 117:   
 118:  //------------------Localisation du Datepicker----------------
 119:  jQuery(function ($) {
 120:      if ($.datepicker != null) {
 121:          $.datepicker.regional['fr'] = { clearText: 'Effacer', clearStatus: '',
 122:              closeText: 'Fermer', closeStatus: 'Fermer sans modifier',
 123:              prevText: '<Préc', prevStatus: 'Voir le mois précédent',
 124:              nextText: 'Suiv>', nextStatus: 'Voir le mois suivant',
 125:              currentText: 'Courant', currentStatus: 'Voir le mois courant',
 126:              monthNames: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin',
 127:        'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],
 128:              monthNamesShort: ['Jan', 'Fév', 'Mar', 'Avr', 'Mai', 'Jun',
 129:        'Jul', 'Aoû', 'Sep', 'Oct', 'Nov', 'Déc'],
 130:              monthStatus: 'Voir un autre mois', yearStatus: 'Voir un autre année',
 131:              weekHeader: 'Sm', weekStatus: '',
 132:              dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
 133:              dayNamesShort: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'],
 134:              dayNamesMin: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'],
 135:              dayStatus: 'Utiliser DD comme premier jour de la semaine', dateStatus: 'Choisir le DD, MM d',
 136:              dateFormat: 'dd/mm/yy', firstDay: 0,
 137:              initStatus: 'Choisir la date', isRTL: false
 138:          };
 139:          $.datepicker.setDefaults($.datepicker.regional['fr']);
 140:      }
 141:  });
 142:   
 143:  $.fn.TabifyCodeFiles = function () {
 144:      $(".divCodeFilesTabStrip").kendoTabStrip({ theme: "Blue Opal" });
 145:  }
 146:   
 147:  //$.fn.defaultHandler = function (jqXHR, textStatus, errorThrown) {
 148:  //    var data = JSON.parse(jqXHR.responseText);
 149:  //    if (data && data.Url) {
 150:  //        window.location = data.url;
 151:  //    }
 152:  //    else {
 153:  //        // TODO: redirect to a fixed error location, alert, etc
 154:  //    }
 155:  //};
 156:   
 157:  //$.ajaxSetup({
 158:  //    'type': 'POST',
 159:  //    'accepts': 'application/json',
 160:  //    'contentType': 'application/json',
 161:  //    'error': function (jqXHR, textStatus, errorThrown) {
 162:  //        if (this[jqXHR.status]) {
 163:  //            this[jqXHR.status](jqXHR, textStatus, errorThrown);
 164:  //        }
 165:  //        else {
 166:  //            // No handlers were found, handle the situation in a global manner here
 167:  //        }
 168:  //    },
 169:  //    '401': $.fn.defaultHandler,
 170:  //    '403': $.fn.defaultHandler,
 171:  //    '500': $.fn.defaultHandler
 172:  //});
 173:   
   1:  @model InnovaApp.Portals.MVC4Portal.Models.ScriptsGModels.inoScriptGModel
   2:  @{
   3:     this.Layout = string.Empty;
   4:     this.Response.ContentType = "text/javascript";
   5:  }
   6:  @foreach (var v in Model.Variables)
   7:  {
   8:     @Html.Raw("var " + v.Key + (!string.IsNullOrEmpty(v.Value.ToString()) ? " = '" + v.Value.ToString().Replace("'", "\\'") : "") + "';\n")   
   9:  }
   1:   
   2:  var ScriptsGData_MainAjaxErrorTitle = 'An error has occurred ...';
   3:  var ScriptsGData_MsgConfirmDelete = 'Are you sure to want to delete this item?';
   4:  var ControllerName = 'Home';