Wednesday, March 20, 2013

How to maintain Footer Link using Sharepoint List in Sharepoint 2013 Publishing Site

Since Web Content Management is one of the great feature in all version of SharePoint.  the basic version of sharepoint which foundation foundation already contain this great feature.

here i will show you it is very convenient if you have public facing web site running under SharePoint foundation. the user can easily maintain the footer navigation link of web site.


First we will create two custom site columns that associated with footer Link. one is the status site column which will allow user to temporarily turn on and off the link.  another one is the sort site column. this feature will let the user to change the link position in the footer link section.

Elements.xml of Status Column which inherits from Boolean Field Type. it will show as a checkbox to let the user check or uncheck to enable or disable the display of link.

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">  
  <Field
       ID="{dd0b38e8-6cee-4135-ad6f-88a62aa84e4c}"
       Name="StatusColumn"
       DisplayName="Status"
       Type="Boolean"
       Required="TRUE"
       Group="Custom Site Columns">
  </Field>
</Elements>


add new Site column named Sort to the project and make it inherits from the Text Field Type. the user can input integer to indicate its position in the footer navigation links section.

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">  
  <Field
       ID="{30701fa1-a7f5-4ece-bba0-2e44836b1c3f}"
       Name="SortOrder"
       DisplayName="Sort Order"
       Type="Text"
       Required="TRUE"
       Group="Custom Site Columns">
  </Field>
</Elements>

add new content type to the project and choose this content type to inherit from Item




Add those columns to the custom content type. as shown in the picture below

add new visual web parts to the project and modify the layout by adding the datalist asp.net control to

<div style="text-align:center;">
    <div style="width:600px; margin-left:auto; margin-right:auto;">
    <asp:DataList ID="dlFooterLink" runat="server" RepeatDirection="Horizontal">
        <ItemTemplate>
            <asp:HyperLink runat="server" Font-Underline="true"  Text='<%# "["+DataBinder.Eval(Container.DataItem,"Title")+"]" %>' 
            NavigateUrl='<%# DataBinder.Eval(Container.DataItem,"Url") %>'></asp:HyperLink>         </ItemTemplate>     </asp:DataList>     </div> </div>

in the code behind, we will implement the business logic that handle the sorting the order of each link and filter out those links with inactive status. In the page loading event,

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
    using (SPSite spSite = new SPSite(SPContext.Current.Web.Url))
    {
        using (SPWeb spWeb = spSite.OpenWeb())
        {
            SPList footerLinkList = spWeb.Lists["test"];
            SPQuery spQuery = new SPQuery();
            spQuery.ViewFields = " <FieldRef Name='Title' /><FieldRef Name='URL' />";
            spQuery.Query = @"<Where><Eq><FieldRef Name='StatusColumn' /><Value Type='Boolean'>1</Value></Eq></Where>
                <OrderBy><FieldRef Name='SortOrder' /></OrderBy>";
            spQuery.ViewFieldsOnly = true;
            SPListItemCollection spListItems = footerLinkList.GetItems(spQuery);
            if (spListItems != null)
            {
                SPFieldUrlValue urlValue = new SPFieldUrlValue();
                //DataTable dt = new DataTable();
                //dt = spListItems.GetDataTable();
                var footerLinkItems = new List<FooterLink>();
                foreach (SPListItem spListItem in spListItems)
                {
                    urlValue = new SPFieldUrlValue(spListItem["URL"].ToString());
                    footerLinkItems.Add(new FooterLink()
                    {
                        Title = spListItem["Title"].ToString(),
                        Url = urlValue.Url
                    });
                }
                dlFooterLink.DataSource = footerLinkItems;
                dlFooterLink.DataBind();
            }
        }
    }
}
}

the code to handle the filter action

<Where><Eq><FieldRef Name='StatusColumn' /><Value Type='Boolean'>1</Value></Eq></Where>

the snippet of code that implement the sorting the position of links

<OrderBy><FieldRef Name='SortOrder' /></OrderBy>


since there is a URL column in the SharePoint which will store the navigation url of each link and  the format of URL is "www.yahoo.com, www.yahoo.com". if we just binding this column to the navigation url property of hyperlink control. the click action will failed due the incorrect format of url. the following code will solve this issue

 urlValue = new SPFieldUrlValue(spListItem["URL"].ToString());
 Url = urlValue.Url
then build and deploy. Now we can add this FootLinkNavigation Web Part to the bottom of the web page, when I click on the new item button on the ribbon toolbar. the page will loaded the following page.


after you removed the default content that associated with custom list. and added the custom content type to be the default content type of the custom sharepoint list.

the sample list that store all navigation links in the footer section

the sample web part to show the footer navigation section



 
 
 

Thursday, February 7, 2013

How to fix error "Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. "

the application worked well when it was run in the .net framework 3.5 and asp.net 2.0 environment.

today i upgrade the application to

"Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled.
Details: Error parsing near ' "




the root cause of this issue is that UpdatePanel control will cuase the conflict with asp.net 4.5 synchronization.

AssociatedUpdatePanelID="UpdatePanel1"
                runat="server">
                <ProgressTemplate>
                    <%--<img alt="progress" src="images/loading.gif" />
           Processing...           --%>
                    <div id="progressBackgroundFilter"></div>
                    <div id="processMessage">
                        <img alt="Loading" src="images/loading.gif" />updating......
                    </div>
                </ProgressTemplate>
            </asp:UpdateProgress>
            <asp:UpdatePanel ID="UpdatePanel1" runat="server">
              

I had to specific which control had trigger the update and cause the error inside the update control panel to fix the issue. 

               <Triggers>
                    <asp:PostBackTrigger ControlID="lnkBtnSave" />
               </Triggers>

AssociatedUpdatePanelID="UpdatePanel1"
                runat="server">
                <ProgressTemplate>
                    <%--<img alt="progress" src="images/loading.gif" />
           Processing...           --%>
                    <div id="progressBackgroundFilter"></div>
                    <div id="processMessage">
                        <img alt="Loading" src="images/loading.gif" />updating......
                    </div>
                </ProgressTemplate>
            </asp:UpdateProgress>
            <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                <Triggers>
                    <asp:PostBackTrigger ControlID="lnkBtnSave" />
               </Triggers>
              <ContentTemplate>
                </ContentTemplate>
            </asp:UpdatePanel> 
 
 
 

Monday, January 28, 2013

How to fix asp.net configuration Error

I try to upgrade my previous project from .Net Framework 2.0, 3.0 and 3.5 to the latest
.Net Framework 4.5.

Server Error in '/MyOldApp' Application.

Configuration Error

Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.

Parser Error Message: Unrecognized attribute 'targetFramework'. Note that attribute names are case-sensitive.

Source Error:

Line 14:   -->
Line 15:   <system.web>
Line 16:     <compilation targetFramework="4.5"/>
Line 17:     <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">
Line 18:       <controls>

Source File: C:\Development\Intranet\MyApp\web.config Line: 16


Version Information: Microsoft .NET Framework Version:2.0.50727.3623; ASP.NET Version:2.0.50727.3618 


the root cause of this issue is that all my application had been configured  to run windows authentication and run under the application pool that configure with service account.

when i set up the application pool, it was configured to run in the asp.net 2.0 environment. 
as a result, i will get the above error when i deployed my upgrade code to staging environment.

after i create a new applicaiton pool running in .net framework 4.0. the configure error is fixed.

Friday, January 25, 2013

How to fix "Could not load file or assembly 'Newtonsoft.Json' or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded."

Today i got a very weired error as following
"Could not load file or assembly 'Newtonsoft.Json' or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded."


when i check my project properties, under the application tab. the target framework had been
set to .Net Framework 3.5














the root cause of this issue is that new library
using System.Net.Http; 
using System.Web.Script.Serialization;  
that Newtonsoft.Json depends on are  Available at the .Net Framework 4.0 or 4.5.
after i switched to the latest .Net Framework.the project compile and the page was launched.





Friday, November 9, 2012

How to add an Metro Style Item to Get Started With Menu in Sharepoint 2013

you can easily spot a list of metro style menu item which acting as the quick launch section when you can launch a site in sharepoint 2012. the following pic will show you what they looks like
currently they are three items in the list.














I will demonstrate on how to add more items to this list.

First click on the Page tab to get the page edit tool bar enable, then click on the Edit button to make the page in edit mode















then click on the Edit Web Part in the drop down menu to load the Web Part Property section.
















Select the All Promotions Link from the dropdown list under Select View Field, then click on
the Apply Button to show the item list.
















Now we can click on the edit link to make the list editable.







Then we need to fill the all the columns with require data. I strongly recommend to
use those pop under windows to fill the information. Otherwise you will receive an error
message when you try to set the summary view in the web part property window.









then click on the stop link to save the new item that I just added to the list.







here is the result after I fill up all the columns  for my demo item.












Now we can follow step 1-3 to launch the web part property window, and select Titles view from dropdown list under Select View and click on the Apply Button














done you will see the Newly create item on the right hand side of the quick access panel.






Wednesday, October 24, 2012

How to Log Error to File in VBScript

 I am an OO developer, but sometime i need to lend a hand to help out the development in VBScript or VB.

Though VBScript is an aging language for me. I still need to pick it up and use it in the
development.

the Error Logger will give you great help in the development and production since the user will come up to you and say the application is not working or not properly working. you will first go to the error log folder and check if anything had been logged to the file.

the following a very simple one that i created in VB to allow user log the error when it is
being raised in the function.


// the constant for read write, append properties for file Open
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8

//function to handle logging the error to file. the parameter FunctionName is the source
// causing the issue. the second paramenter Error is like Exception in C# stored all the information
//related to the error.

function LogErrorToFile(FunctionName,Error)
   Dim fso, tf,logFilePath
   logFilePath="C:\ErrorLogFolder\MyErrorFileName"& FormattedCurrentDate&".Log"
   Set fso = CreateObject("Scripting.FileSystemObject")
    if fso.FileExists(logFilePath) Then
        Set tf = fso.OpenTextFile(logFilePath, ForAppending, TRUE)
   else
        Set tf = fso.CreateTextFile(logFilePath, True)
   end if
   tf.WriteLine("************************************************" & Now() & "********************************************************")
   tf.WriteLine("Function: " & FunctionName )
   tf.WriteLine("Error Numnber: " & CStr(Err.Number))
   tf.WriteLine("Source: " & Err.Source)
   tf.WriteLine("Detail Error Message:" & Err.Description)
   tf.WriteLine("****************************************************************************************************************************") 
   tf.WriteBlankLines(1)
   tf.Close
   Set fso =nothing
End function

//helper function to format to the current date to
//yyyy_MM_dd
Function FormattedCurrentDate
  currentDate = CDate(Date)
  currentDay = DatePart("d", currentDate )
  currentMonth = DatePart("m", currentDate )
  currentYear = DatePart("yyyy", currentDate )
  If currentDay < 10 Then
    currentDay = "0" & currentDay
  End If
  If currentMonth < 10 Then
    currentMonth = "0" & currentMonth
  End If
  FormattedCurrentDate= currentYear & "_" & currentMonth onth & "_" & currentDay
End Function

the example to see you how to use the Error Logger inside the function


function MyFunction
          on Error Resume Next
          // your logic here
          if Err.Number <> 0 then 
           LogErrorToFile "MyFunction",Err
       end if

end function

Wednesday, October 17, 2012

How to use javascript to trigger the server side event

put the following javascript code in the Javascript file

 $(function () {
                 var dates = $("#txtDateFrom, #txtDateTo").datepicker({
                     defaultDate: "+1w",
                     changeMonth: true,
                     changeYear: true,
                     numberOfMonths: 1,
                     onSelect: function (selectedDate) {
                         var option = this.id == "txtDateFrom" ? "minDate" : "maxDate",
     instance = $(this).data("datepicker"),
     date = $.datepicker.parseDate(
      instance.settings.dateFormat ||
      $.datepicker._defaults.dateFormat,
      selectedDate, instance.settings);
                         dates.not(this).datepicker("option", option, date);
 
                        
                         if (this.id == "txtDateFrom") {
                             $("#txtDateFrom").change();
                         }
                       
                         else if (this.id == "txtDateTo") {
                             $("#txtDateTo").change();
                         }
                     }
                 });
           });

use the html element change event to trigger the server side. we fill the date from or date to textbox,
the textbox change event will be fired in the client.we must force the change event to fire since we do not use keyboard to input the date, instead we selected the date from the slide out calendar. as a result the textbox is unable to capture the content change.

$("#txtDateFrom").change();

in aspx page

<asp:textbox id="txtDateFrom" runat="server" AutoPostBack="true" 
OnTextChanged="txtDateFrom_onTextChanged"></asp:textbox>
 
in the code behind file we need to implement the evnet
 
 protected void txtDateFrom_onTextChanged(object sender, EventArgs e)
 {
         //your logic to implement here
 }