c a n d l a n d . n e t

Setup N2Cms on an Asp.Net MVC

Dusty Candland | |

The following are my notes on setting up a n2cms site starting with a default MVC project and copying in the needed stuff from the Example_Mvc sample from the n2cms site.

Starting with a new MVC site. Reference the dll’s in the \Example_Mvc\Mvc\wwwroot\Bin folder. I copied them to an externals folder under my solution and referenced them there.

Global.asax

  1. Add IEngine parameter to the RegisterRoutes method.

  2. Add a new ContentRoute to the RouteCollection.

  3. Add an ignore for .ashx routes.

  4. Initialize the N2 engine and pass to the RegisterRoutes in the Application_Start()

  5. Override Init and attach this to the EventRroker instance.

 

    public class MvcApplication : System.Web.HttpApplication

    {

        public static void RegisterRoutes(RouteCollection routes, IEngine engine)

        {

            routes.IgnoreRoute("{resource}.axd/{pathInfo}");

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; routes.IgnoreRoute(<span style="color: #a31515">"{resource}.ashx/{</em>pathInfo}"</span>);
</p>

<p style="margin: 0px">
  &#160;
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: green">// This route detects content item paths and executes their controller</span>
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; routes.Add(<span style="color: blue">new</span> <span style="color: #2b91af">ContentRoute</span>(engine));
</p>

<p style="margin: 0px">
  &#160;
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; routes.MapRoute(
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #a31515">"Default"</span>,&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: green">// Route name</span>
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #a31515">"{controller}/{action}/{id}"</span>,&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: green">// URL with parameters</span>
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">new</span> { controller = <span style="color: #a31515">"Home"</span>, action = <span style="color: #a31515">"Index"</span>, id = <span style="color: #a31515">""</span> }&#160; <span style="color: green">// Parameter defaults</span>
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; );
</p>

<p style="margin: 0px">
  &#160;
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160; }
</p>

<p style="margin: 0px">
  &#160;
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">protected</span> <span style="color: blue">void</span> Application_Start()
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160; {
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: green">// normally the engine is initialized by the initializer module but it can also be initialized this programmatically</span>
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: green">// since we attach programmatically we need to associate the event broker with a http application</span>
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #2b91af">IEngine</span> engine = N2.<span style="color: #2b91af">Context</span>.Initialize(<span style="color: blue">false</span>);
</p>

<p style="margin: 0px">
  &#160;
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; RegisterRoutes(<span style="color: #2b91af">RouteTable</span>.Routes, engine);
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160; }
</p>

<p style="margin: 0px">
  &#160;
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">void</span> Init()
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160; {
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #2b91af">EventBroker</span>.Instance.Attach(<span style="color: blue">this</span>);
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">base</span>.Init();
</p>

<p style="margin: 0px">
  &#160;&#160;&#160;&#160;&#160;&#160;&#160; }
</p>

<p style="margin: 0px">
  &#160;&#160;&#160; }
</p></p></div> 

<h4>
  Web.config
</h4>

<p>
  Add the n2 config sections.
</p>

<div style="font-size: 10pt; background: white; color: black; font-family: courier new">
  <p style="margin: 0px">
    &#160;
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160; <</span><span style="color: #a31515">sectionGroup</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">n2</span>"<span style="color: blue"> </span><span style="color: red">type</span><span style="color: blue">=</span>"<span style="color: blue">N2.Configuration.SectionGroup, N2</span>"<span style="color: blue">></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160; <</span><span style="color: #a31515">section</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">host</span>"<span style="color: blue"> </span><span style="color: red">type</span><span style="color: blue">=</span>"<span style="color: blue">N2.Configuration.HostSection, N2</span>"<span style="color: blue"> </span><span style="color: red">requirePermission</span><span style="color: blue">=</span>"<span style="color: blue">false</span>"<span style="color: blue">/></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160; <</span><span style="color: #a31515">section</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">engine</span>"<span style="color: blue"> </span><span style="color: red">type</span><span style="color: blue">=</span>"<span style="color: blue">N2.Configuration.EngineSection, N2</span>"<span style="color: blue"> </span><span style="color: red">requirePermission</span><span style="color: blue">=</span>"<span style="color: blue">false</span>"<span style="color: blue">/></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160; <</span><span style="color: #a31515">section</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">database</span>"<span style="color: blue"> </span><span style="color: red">type</span><span style="color: blue">=</span>"<span style="color: blue">N2.Configuration.DatabaseSection, N2</span>"<span style="color: blue"> </span><span style="color: red">requirePermission</span><span style="color: blue">=</span>"<span style="color: blue">false</span>"<span style="color: blue">/></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160; <</span><span style="color: #a31515">section</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">edit</span>"<span style="color: blue"> </span><span style="color: red">type</span><span style="color: blue">=</span>"<span style="color: blue">N2.Configuration.EditSection, N2</span>"<span style="color: blue"> </span><span style="color: red">requirePermission</span><span style="color: blue">=</span>"<span style="color: blue">false</span>"<span style="color: blue">/></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160; </</span><span style="color: #a31515">sectionGroup</span><span style="color: blue">></span>
  </p></p>
</div>

<p>
  Change the connection string name to N2CMS
</p>

<p>
  Add the n2 section.
</p>

<div style="font-size: 10pt; background: white; color: black; font-family: courier new">
  <p style="margin: 0px">
    <span style="color: blue"><</span><span style="color: #a31515">n2</span><span style="color: blue">></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160; <!&mdash;</span><span style="color: green"> If you install a database from scrach you&rsquo;ll need to insert some required pages. This can be done by the web based installer located at http://yoursite/install/edit </span><span style="color: blue">&mdash;></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160; <</span><span style="color: #a31515">host</span><span style="color: blue"> </span><span style="color: red">rootID</span><span style="color: blue">=</span>"<span style="color: blue">1</span>"<span style="color: blue"> </span><span style="color: red">startPageID</span><span style="color: blue">=</span>"<span style="color: blue">1</span>"<span style="color: blue">></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160; <</span><span style="color: #a31515">web</span><span style="color: blue"> </span><span style="color: red">extension</span><span style="color: blue">=</span>""<span style="color: blue"> </span><span style="color: red">rewrite</span><span style="color: blue">=</span>"<span style="color: blue">None</span>"<span style="color: blue">></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <</span><span style="color: #a31515">urls</span><span style="color: blue"> </span><span style="color: red">enableCaching</span><span style="color: blue">=</span>"<span style="color: blue">false</span>"<span style="color: blue">/></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160; </</span><span style="color: #a31515">web</span><span style="color: blue">></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160; </</span><span style="color: #a31515">host</span><span style="color: blue">></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160; <</span><span style="color: #a31515">engine</span><span style="color: blue">></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160; <</span><span style="color: #a31515">assemblies</span><span style="color: blue">></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <!&mdash;</span><span style="color: green"> These are only needed for medium trust</span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: green">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <add assembly="N2"/></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: green">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <add assembly="N2.Edit"/></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: green">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <add assembly="N2.Security"/> </span><span style="color: blue">&mdash;></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160; </</span><span style="color: #a31515">assemblies</span><span style="color: blue">></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160; </</span><span style="color: #a31515">engine</span><span style="color: blue">></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160; <!&mdash;</span><span style="color: green"> Other flavours: SqlServer2005, SqlServer2000, MySql, SqLite </span><span style="color: blue">&mdash;></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160; <</span><span style="color: #a31515">database</span><span style="color: blue"> </span><span style="color: red">connectionStringName</span><span style="color: blue">=</span>"<span style="color: blue">N2CMS</span>"<span style="color: blue"> </span><span style="color: red">flavour</span><span style="color: blue">=</span>"<span style="color: blue">SqlServer2005</span>"<span style="color: blue">/></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160; <</span><span style="color: #a31515">edit</span><span style="color: blue">></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160; <</span><span style="color: #a31515">installer</span><span style="color: blue"> </span><span style="color: red">checkInstallationStatus</span><span style="color: blue">=</span>"<span style="color: blue">true</span>"<span style="color: blue">/></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160; </</span><span style="color: #a31515">edit</span><span style="color: blue">></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160; </</span><span style="color: #a31515">n2</span><span style="color: blue">></span>
  </p></p>
</div>

<p>
  Add expressionBuilders to the system.web compilation section.
</p>

<div style="font-size: 10pt; background: white; color: black; font-family: courier new">
  <p style="margin: 0px">
    &#160;
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160; <</span><span style="color: #a31515">expressionBuilders</span><span style="color: blue">></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">expressionPrefix</span><span style="color: blue">=</span>"<span style="color: blue">CurrentItem</span>"<span style="color: blue"> </span><span style="color: red">type</span><span style="color: blue">=</span>"<span style="color: blue">N2.Web.Compilation.CurrentItemExpressionBuilder, N2</span>"<span style="color: blue">/></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">expressionPrefix</span><span style="color: blue">=</span>"<span style="color: blue">CurrentPage</span>"<span style="color: blue"> </span><span style="color: red">type</span><span style="color: blue">=</span>"<span style="color: blue">N2.Web.Compilation.CurrentPageExpressionBuilder, N2</span>"<span style="color: blue">/></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">expressionPrefix</span><span style="color: blue">=</span>"<span style="color: blue">Code</span>"<span style="color: blue"> </span><span style="color: red">type</span><span style="color: blue">=</span>"<span style="color: blue">N2.Web.Compilation.CodeExpressionBuilder, N2</span>"<span style="color: blue">/></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">expressionPrefix</span><span style="color: blue">=</span>"<span style="color: blue">StartPage</span>"<span style="color: blue"> </span><span style="color: red">type</span><span style="color: blue">=</span>"<span style="color: blue">N2.Web.Compilation.StartPageExpressionBuilder, N2</span>"<span style="color: blue">/></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">expressionPrefix</span><span style="color: blue">=</span>"<span style="color: blue">HasValue</span>"<span style="color: blue"> </span><span style="color: red">type</span><span style="color: blue">=</span>"<span style="color: blue">N2.Web.Compilation.HasValueExpressionBuilder, N2</span>"<span style="color: blue">/></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160; </</span><span style="color: #a31515">expressionBuilders</span><span style="color: blue">></span>
  </p></p>
</div>

<p>
  Change the forms authentication section.
</p>

<div style="font-size: 10pt; background: white; color: black; font-family: courier new">
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160; <</span><span style="color: #a31515">forms</span><span style="color: blue"> </span><span style="color: red">loginUrl</span><span style="color: blue">=</span>"<span style="color: blue">edit/login.aspx</span>"<span style="color: blue"> </span><span style="color: red">protection</span><span style="color: blue">=</span>"<span style="color: blue">All</span>"<span style="color: blue"> </span><span style="color: red">timeout</span><span style="color: blue">=</span>"<span style="color: blue">30000</span>"<span style="color: blue"> </span><span style="color: red">path</span><span style="color: blue">=</span>"<span style="color: blue">/</span>"<span style="color: blue">></span>
  </p>
  
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160; </</span><span style="color: #a31515">forms</span><span style="color: blue">></span>
  </p></p>
</div>

<p>
  Add the n2 tag prefix to the pages controls section.
</p>

<div style="font-size: 10pt; background: white; color: black; font-family: courier new">
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">tagPrefix</span><span style="color: blue">=</span>"<span style="color: blue">n2</span>"<span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>"<span style="color: blue">N2</span>"<span style="color: blue"> </span><span style="color: red">namespace</span><span style="color: blue">=</span>"<span style="color: blue">N2.Web.UI.WebControls</span>"<span style="color: blue">/></span>
  </p></p>
</div>

<p>
  Add the n2.ashx httpHandler
</p>

<div style="font-size: 10pt; background: white; color: black; font-family: courier new">
  <p style="margin: 0px">
    <span style="color: blue">&#160;&#160;&#160;&#160;&#160; <</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">path</span><span style="color: blue">=</span>"<span style="color: blue"><em>.n2.ashx</span>"<span style="color: blue"> </span><span style="color: red">verb</span><span style="color: blue">=</span>"<span style="color: blue"></em></span>"<span style="color: blue"> </span><span style="color: red">type</span><span style="color: blue">=</span>"<span style="color: blue">N2.Web.AjaxRequestHandler, N2</span>"<span style="color: blue"> /></span></p> </p></div> 
    
    <p>
      Add a handler to the system.webServer handlers section.
    </p>
    
    <div style="font-size: 10pt; background: white; color: black; font-family: courier new">
      <p style="margin: 0px">
        <span style="color: blue">&#160;&#160;&#160;&#160;&#160; <</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">n2.ajax</span>"<span style="color: blue"> </span><span style="color: red">path</span><span style="color: blue">=</span>"<span style="color: blue"><em>.n2.ashx</span>"<span style="color: blue"> </span><span style="color: red">verb</span><span style="color: blue">=</span>"<span style="color: blue"></em></span>"<span style="color: blue"> </span><span style="color: red">type</span><span style="color: blue">=</span>"<span style="color: blue">N2.Web.AjaxRequestHandler, N2</span>"<span style="color: blue"> /></span></p> </p></div> 
        
        <h4>
          The Start and Root Controller
        </h4>
        
        <p>
          Now we need to add a a ContentController class to the Controllers folder. And an AbstractPage and ContentPage to the Models folder. And a Content folder and DefaultView.aspx page the Views\Content folder. This will become the start and root nodes for the N2 CMS.
        </p>
        
        <p>
          Models\AbstractPage.cs
        </p>
        
        <div style="font-size: 10pt; background: white; color: black; font-family: courier new">
          <p style="margin: 0px">
            <span style="color: blue">using</span> N2;
          </p>
          
          <p style="margin: 0px">
            <span style="color: blue">using</span> N2.Details;
          </p>
          
          <p style="margin: 0px">
            &#160;
          </p>
          
          <p style="margin: 0px">
            <span style="color: blue">namespace</span> Red27.Site.Models
          </p>
          
          <p style="margin: 0px">
            {
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160; [<span style="color: #2b91af">WithEditableTitle</span>, <span style="color: #2b91af">WithEditableName</span>]
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160; <span style="color: blue">public</span> <span style="color: blue">class</span> <span style="color: #2b91af">AbstractPage</span> : <span style="color: #2b91af">ContentItem</span>, <span style="color: #2b91af">INode</span>
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160; {
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">public</span> <span style="color: blue">string</span> PreviewUrl
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; {
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">get</span> { <span style="color: blue">return</span> Url; }
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; }
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160; }
          </p>
          
          <p style="margin: 0px">
            }
          </p></p>
        </div>
        
        <p>
          Models\ContentPage.cs
        </p>
        
        <div style="font-size: 10pt; background: white; color: black; font-family: courier new">
          <p style="margin: 0px">
            <span style="color: blue">using</span> N2;
          </p>
          
          <p style="margin: 0px">
            <span style="color: blue">using</span> N2.Details;
          </p>
          
          <p style="margin: 0px">
            &#160;
          </p>
          
          <p style="margin: 0px">
            <span style="color: blue">namespace</span> Red27.Site.Models
          </p>
          
          <p style="margin: 0px">
            {
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160; [<span style="color: #2b91af">Definition</span>(<span style="color: #a31515">"Content Page"</span>, Installer = N2.Installation.<span style="color: #2b91af">InstallerHint</span>.PreferredStartPage)]
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160; <span style="color: blue">public</span> <span style="color: blue">class</span> <span style="color: #2b91af">ContentPage</span> : <span style="color: #2b91af">AbstractPage</span>
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160; {
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; [<span style="color: #2b91af">EditableFreeTextArea</span>(<span style="color: #a31515">"Text"</span>, 100)]
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">public</span> <span style="color: blue">virtual</span> <span style="color: blue">string</span> Text
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; {
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">get</span> { <span style="color: blue">return</span> (<span style="color: blue">string</span>)(GetDetail(<span style="color: #a31515">"Text"</span>) ?? <span style="color: blue">string</span>.Empty); }
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">set</span> { SetDetail(<span style="color: #a31515">"Text"</span>, <span style="color: blue">value</span>, <span style="color: blue">string</span>.Empty); }
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; }
          </p>
          
          <p style="margin: 0px">
            &#160;
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">string</span> TemplateUrl
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; {
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">get</span> { <span style="color: blue">return</span> <span style="color: #a31515">"/Views/Content/DefaultView.aspx"</span>; }
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; }
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160; }
          </p>
          
          <p style="margin: 0px">
            }
          </p></p>
        </div>
        
        <p>
          Controllers\ContentController.cs
        </p>
        
        <div style="font-size: 10pt; background: white; color: black; font-family: courier new">
          <p style="margin: 0px">
            <span style="color: blue">using</span> N2.Web;
          </p>
          
          <p style="margin: 0px">
            <span style="color: blue">using</span> Red27.Site.Models;
          </p>
          
          <p style="margin: 0px">
            <span style="color: blue">using</span> N2.Web.Mvc;
          </p>
          
          <p style="margin: 0px">
            &#160;
          </p>
          
          <p style="margin: 0px">
            <span style="color: blue">namespace</span> Red27.Site.Controllers
          </p>
          
          <p style="margin: 0px">
            {
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160; [<span style="color: #2b91af">Controls</span>(<span style="color: blue">typeof</span>(<span style="color: #2b91af">AbstractPage</span>))]
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160; <span style="color: blue">public</span> <span style="color: blue">class</span> <span style="color: #2b91af">ContentController</span> : <span style="color: #2b91af">ContentController</span><<span style="color: #2b91af">AbstractPage</span>>
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160; {
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160; }
          </p>
          
          <p style="margin: 0px">
            }
          </p></p>
        </div>
        
        <p>
          Views\Content\DefaultView.aspx
        </p>
        
        <div style="font-size: 10pt; background: white; color: black; font-family: courier new">
          <p style="margin: 0px">
            <span style="background: #ffee62"><%</span><span style="color: blue">@</span> <span style="color: #a31515">Page</span> <span style="color: red">Title</span><span style="color: blue">=""</span> <span style="color: red">Language</span><span style="color: blue">="C#"</span> <span style="color: red">MasterPageFile</span><span style="color: blue">="~/Views/Shared/Site.Master"</span> <span style="color: red">AutoEventWireup</span><span style="color: blue">="true"</span>
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160; <span style="color: red">Inherits</span><span style="color: blue">="ViewPage<ContentPage>"</span> <span style="background: #ffee62">%></span>
          </p>
          
          <p style="margin: 0px">
            &#160;
          </p>
          
          <p style="margin: 0px">
            <span style="background: #ffee62"><%</span><span style="color: blue">@</span> <span style="color: #a31515">Import</span> <span style="color: red">Namespace</span><span style="color: blue">="Red27.Site.Models"</span> <span style="background: #ffee62">%></span>
          </p>
          
          <p style="margin: 0px">
            <span style="color: blue"><</span><span style="color: #a31515">asp</span><span style="color: blue">:</span><span style="color: #a31515">Content</span> <span style="color: red">ID</span><span style="color: blue">="Content1"</span> <span style="color: red">ContentPlaceHolderID</span><span style="color: blue">="MainContent"</span> <span style="color: red">runat</span><span style="color: blue">="server"></span>
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160; <span style="color: blue"><</span><span style="color: #a31515">h1</span><span style="color: blue">></span>
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="background: #ffee62"><%</span><span style="color: blue">=</span> Model.Title <span style="background: #ffee62">%></span><span style="color: blue"></</span><span style="color: #a31515">h1</span><span style="color: blue">></span>
          </p>
          
          <p style="margin: 0px">
            &#160;&#160;&#160; <span style="background: #ffee62"><%</span><span style="color: blue">=</span> Model.Text <span style="background: #ffee62">%></span>
          </p>
          
          <p style="margin: 0px">
            <span style="color: blue"></</span><span style="color: #a31515">asp</span><span style="color: blue">:</span><span style="color: #a31515">Content</span><span style="color: blue">></span>
          </p></p>
        </div>
        
        <h4>
          Initial DB Setup
        </h4>
        
        <p>
          Copy the Edit directory from Example_Mvc\Mvc\wwwroot to the root of your web project. This is the code that handles setup and content management and shouldn’t need to be modified. Add a new mdf database in the app_data directory or point the connection string to some other DB.
        </p>
        
        <p>
          Now the site can be compiled and run. This should bring up the /edit/install page to create the db tables and insert the root node value. You may need to stop the development server and restart it to see your ContentPage in the root and start node drop downs. Once this is done you should be able to edit the content of your Start Page!
        </p>
        
        <h4>
          What’s Next?
        </h4>
        
        <p>
          A few more details need to be handled, like authentication, some N2 setup on the Site.Master page, and some clean up of unused pages from the MVC project setup.
        </p></p>

Webmentions

These are webmentions via the IndieWeb and webmention.io. Mention this post from your site:


© 2006 - 2023 candland.net