Asp.Net統一前后端提示信息方案


目錄

 

 

要解決的問題
  1. 減少彈框前后端代碼量
  2. 增強可維護性
  3. 前后端提示資源統一
  4. 可以實現簡單的多語言提示方案
  5. 增強重用性和易用性

      ...

用自定義XML匯總提示信息
  • 為了實現前后端提示資源的統一,把提示信息放入自定義XML文件中,初步想法如下(alerttip節點表提示信息節點)
<?xml version="1.0" encoding="utf-8" ?>
<tiplist> 
  <alerttip>
    <id>1</id>
    <chinese>成功</chinese>  
  </alerttip>
  <alerttip>
    <id>-1</id>
    <chinese>失敗</chinese>   
  </alerttip>
</tiplist>
  • 進一步為了實現簡單支持多語言版本和語言設置進一步修改XML結構,修改后如下(增加language節點控制項目語言版本,每個alerttip節點下增加其它語言提示信息)
<?xml version="1.0" encoding="utf-8" ?>
<tiplist>
  <language>
    <value>chinese</value>
  </language>
  <alerttip>
    <id>1</id>
    <chinese>成功</chinese>
    <english>success</english>
  </alerttip>
  <alerttip>
    <id>-1</id>
    <chinese>失敗</chinese>
    <english>fail</english>
  </alerttip>
</tiplist>
前端彈框實現
  • Jquery解析XML文件,通過ID節點,返回對應的提示信息
function getTip(tipId) {
    var returnVal = "";
    $.ajax({
        url: 'xml/tip.xml',
        type: 'get',
        dataType: 'xml',
        timeout: 1000,
        cache: true,
        async: false,
        error: function(xml) {
            returnVal = 'Loading Error!';
        },
        success: function(xml) {
            var language = $(xml).find('language:first').children("value").text();
            $(xml).find("alerttip").each(function(i) {
                var idVal = $(this).children("id").text();
                if (idVal == tipId) {
                    returnVal = $(this).children(language).text();
                    return false;
                }
            });
        }
    });
    return returnVal;
}
  • 提取彈框提示方法
/*-------------------------------------------------------------------------------------------
功能:Windows彈框,通過傳入XML文件中ID節點的text查找提示正文
參數:tipId表示XML中ID節點的text
---------------------------------------------------------------------------------------------*/
function alertXml(tipId) {
    alert(getTip(tipId));
}

/*-------------------------------------------------------------------------------------------
功能:Windows彈框,通過傳入提示正文
參數:tips表示提示正文
destUrl表示要跳轉的目的路徑
---------------------------------------------------------------------------------------------*/
function alertGo(tips, destUrl) {
    alert(tips);
    location.href = destUrl;
}

/*-------------------------------------------------------------------------------------------
功能:Windows彈框,通過傳入XML文件中ID節點的text查找提示正文
參數:tipId表示XML中ID節點的text
destUrl表示要跳轉的目的頁面路徑
---------------------------------------------------------------------------------------------*/
function alertGoXml(tipId, destUrl) {
    alertGo(getTip(tipId), destUrl);
}
后端彈框實現
  • C#解析XML文件,存入Dictionary,並添加XML文件依賴緩存
        

         //提示信息字典
         private static Dictionary<string, string> tipDic = null;


#region## 根據ID從XML文件中獲取提示信息 /// <summary> /// 根據ID從XML文件中獲取提示信息 /// 進行XML文件依賴緩存 /// </summary> /// <param name="filePath">XML提示文件路徑</param> /// <param name="tipId">XML文件中ID節點</param> /// <returns>提示信息</returns> private static string GetTipDic(string filePath, string tipId) { string tipStr = string.Empty; if (HttpRuntime.Cache["TipCache"] == null) { tipDic = new Dictionary<string, string>(); string xmlPath = HttpContext.Current.Server.MapPath(filePath); XDocument doc = XDocument.Load(xmlPath); var language = doc.Descendants("language").First().Element("value").Value; var tipList = doc.Descendants("alerttip"); foreach (var item in tipList) { string id = item.Element("id").Value; if (!tipDic.ContainsKey(id)) { tipDic.Add(id, item.Element(language).Value); } } CacheDependency dep = new CacheDependency(xmlPath); HttpRuntime.Cache.Insert("TipCache", tipDic, dep, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration); } else { tipDic = HttpRuntime.Cache["TipCache"] as Dictionary<string, string>; } if (tipDic.ContainsKey(tipId)) { tipStr = tipDic[tipId]; } return tipStr; } #endregion
  • 提取彈框方法
       //提示XML文件
        private const string tipXmlPath = "xml/tip.xml";

        #region## Windows彈框
        /// <summary>
        /// 功能:Windows彈框
        /// </summary>
        /// <param name="content">提示正文</param>
        public static void Alert(string content)
        {
            AlertBase(content, null, null);
        }

        /// <summary>
        /// 功能:Windows彈框,從XML中得到提示信息
        /// </summary>
        /// <param name="tipId">XML文件中ID節點值</param>
        public static void AlertXml(string tipId)
        {
            AlertBase(GetTipDic(tipXmlPath, tipId), null, null);
        }

        /// <summary>
        /// 功能:彈框並跳轉
        /// </summary>
        /// <param name="content">提示正文</param>
        /// <param name="url">跳轉的URL</param>
        public static void AlertGo(string content, string url)
        {
            AlertBase(content, url, null);
        }

        /// <summary>
        /// 功能:彈框並跳轉,從XML中得到提示信息
        /// </summary>
        /// <param name="tipId">XML文件中ID節點值</param>
        /// <param name="url">跳轉的URL</param>
        public static void AlertGoXml(string tipId, string url)
        {
            AlertBase(GetTipDic(tipXmlPath, tipId), url, null);
        }

        /// <summary>
        ///  功能:Windows彈框
        /// </summary>
        /// <param name="alertContext">提示正文</param>
        /// <param name="url">跳轉跳徑</param>
        /// <param name="otherScripts">腳本</param>
        private static void AlertBase(string alertContext, string url, string otherScripts)
        {
            Page page = HttpContext.Current.Handler as Page;

            System.Text.StringBuilder sb = new System.Text.StringBuilder();

            if (!string.IsNullOrEmpty(alertContext))
            {
                sb.AppendFormat("alert(\"{0}\");", alertContext);
            }

            if (!string.IsNullOrEmpty(url))
            {
                sb.AppendFormat("location.href=\"{0}\";", url);
            }

            if (!string.IsNullOrEmpty(otherScripts))
            {
                sb.AppendFormat("{0};", otherScripts);
            }

            page.ClientScript.RegisterStartupScript(page.GetType(), "", sb.ToString(), true);
        }
        #endregion
擴展和整合

網頁為了更好用戶體驗一般會選擇一些JS插件形式的彈出提示,我這里也用擴展一個JQuery彈出插件 jQuery BlockUI Plugin 

插件API或DEMO:http://malsup.com/jquery/block/#demos

  • 增加前端BlockUI提示並提取各方法到一個JS文件
/*-------------------------------------------------------------------------------------------
功能:通過XML中的ID節點text返回提示信息
參數:tipId表示XML中ID節點的text
---------------------------------------------------------------------------------------------*/
function getTip(tipId) {
    var returnVal = "";
    $.ajax({
        url: 'xml/tip.xml',
        type: 'get',
        dataType: 'xml',
        timeout: 1000,
        cache: true,
        async: false,
        error: function(xml) {
            returnVal = 'Loading Error!';
        },
        success: function(xml) {
            var language = $(xml).find('language:first').children("value").text();
            $(xml).find("alerttip").each(function(i) {
                var idVal = $(this).children("id").text();
                if (idVal == tipId) {
                    returnVal = $(this).children(language).text();
                    return false;
                }
            });
        }
    });
    return returnVal;
}

/*-------------------------------------------------------------------------------------------
功能:Windows彈框,通過傳入XML文件中ID節點的text查找提示正文
參數:tipId表示XML中ID節點的text
---------------------------------------------------------------------------------------------*/
function alertXml(tipId) {
    alert(getTip(tipId));
}

/*-------------------------------------------------------------------------------------------
功能:Windows彈框,通過傳入提示正文
參數:tips表示提示正文
destUrl表示要跳轉的目的路徑
---------------------------------------------------------------------------------------------*/
function alertGo(tips, destUrl) {
    alert(tips);
    location.href = destUrl;
}

/*-------------------------------------------------------------------------------------------
功能:Windows彈框,通過傳入XML文件中ID節點的text查找提示正文
參數:tipId表示XML中ID節點的text
destUrl表示要跳轉的目的頁面路徑
---------------------------------------------------------------------------------------------*/
function alertGoXml(tipId, destUrl) {
    alertGo(getTip(tipId), destUrl);
}

/*-------------------------------------------------------------------------------------------
功能:BlockUI彈框,提示正文直接由參數傳入
參數:tips表示提示正文
---------------------------------------------------------------------------------------------*/
function alertBlockUi(tips) {
    $.blockUI({ message: '<br/><h1>' + tips + '</h1><br/>', css: { width: '600px' }, timeout: 2000 });
}

/*-------------------------------------------------------------------------------------------
功能:BlockUI彈框,通過傳入XML文件中ID節點的text查找提示正文
參數:tipId表示XML中ID節點的text
---------------------------------------------------------------------------------------------*/
function alertBlockUiXml(tipId) {
    alertBlockUi(getTip(tipId));
}

/*-------------------------------------------------------------------------------------------
功能:BlockUI彈框並跳轉,提示正文直接由參數傳入
參數:tips表示提示正文
             destUrl表示要跳轉的目的頁面路徑
---------------------------------------------------------------------------------------------*/
function alertBlockUiGo(tips, destUrl) {
    $.blockUI({ message: '<br/><h1>' + tips + '</h1><br/>', css: { width: '600px' }, timeout: 2000 });
    setTimeout(function() { $.unblockUI({ onUnblock: function() { location.href = destUrl; } }); }, 2000);
}

/*-------------------------------------------------------------------------------------------
功能:BlockUI彈框並跳轉,通過傳入XML文件中ID節點的text查找提示正文
參數:tipId表示XML中ID節點的text
             destUrl表示要跳轉的目的頁面路徑
---------------------------------------------------------------------------------------------*/
function alertBlockUiGoXml(tipId, destUrl) {
    alertBlockUiGo(getTip(tipId), destUrl);
}
alert.js 【展開查看詳細】
alert.js 函數說明  
函數名 說明
getTip(tipId)

方法:

從XML中獲取提示信息

參數:

tipId:XML文件中提示信息的對應的ID節點

alertXml(tipId)

方法:

Windows彈框(提示信息從XML中獲取)

參數:

tipId:XML文件中提示信息的對應的ID節點

alertGo(tips, destUrl) 

方法:

Windows彈框並跳轉

參數:

tips:提示正文

destUrl:跳轉目的路徑

alertGoXml(tipId, destUrl)

Windows彈框並跳轉提示信息從XML中獲取)

參數:

tipId:XML文件中提示信息的對應的ID節點

destUrl:跳轉目的路徑

alertBlockUi(tips)

BlockUI插件彈框

參數:

tips:提示正文

alertBlockUiXml(tipId) 

BlockUI插件彈框(提示信息從XML中獲取)

參數:

tipId:XML文件中提示信息的對應的ID節點

alertBlockUiGo(tips, destUrl)

BlockUI插件彈框並跳轉

參數:

tips:提示正文

destUrl:跳轉目的路徑

alertBlockUiGoXml(tipId, destUrl)

BlockUI插件彈框並跳轉(提示信息從XML中獲取)

參數:

tipId:XML文件中提示信息的對應的ID節點

destUrl:跳轉目的路徑

  • 增加后端BlockUI提示並提取各方法到一個.cs文件
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Caching;
using System.Web.UI;
using System.Xml.Linq;

namespace Utils
{
    /// <summary>
    /// 功能:       彈框幫助類
    /// 創建人:  Wilson
    /// 時間:       2013-08-07
    /// 描述:       添加 System.Web  引用
    /// </summary>
    public class AlertHelper
    {
        //提示信息字典
        private static Dictionary<string, string> tipDic = null;

        //提示XML文件
        private const string tipXmlPath = "xml/tip.xml";

        #region## Windows彈框
        /// <summary>
        /// 功能:Windows彈框
        /// </summary>
        /// <param name="content">提示正文</param>
        public static void Alert(string content)
        {
            AlertBase(content, null, null);
        }

        /// <summary>
        /// 功能:Windows彈框,從XML中得到提示信息
        /// </summary>
        /// <param name="tipId">XML文件中ID節點值</param>
        public static void AlertXml(string tipId)
        {
            AlertBase(GetTipDic(tipXmlPath, tipId), null, null);
        }

        /// <summary>
        /// 功能:彈框並跳轉
        /// </summary>
        /// <param name="content">提示正文</param>
        /// <param name="url">跳轉的URL</param>
        public static void AlertGo(string content, string url)
        {
            AlertBase(content, url, null);
        }

        /// <summary>
        /// 功能:彈框並跳轉,從XML中得到提示信息
        /// </summary>
        /// <param name="tipId">XML文件中ID節點值</param>
        /// <param name="url">跳轉的URL</param>
        public static void AlertGoXml(string tipId, string url)
        {
            AlertBase(GetTipDic(tipXmlPath, tipId), url, null);
        }

        /// <summary>
        ///  功能:Windows彈框
        /// </summary>
        /// <param name="alertContext">提示正文</param>
        /// <param name="url">跳轉跳徑</param>
        /// <param name="otherScripts">腳本</param>
        private static void AlertBase(string alertContext, string url, string otherScripts)
        {
            Page page = HttpContext.Current.Handler as Page;

            System.Text.StringBuilder sb = new System.Text.StringBuilder();

            if (!string.IsNullOrEmpty(alertContext))
            {
                sb.AppendFormat("alert(\"{0}\");", alertContext);
            }

            if (!string.IsNullOrEmpty(url))
            {
                sb.AppendFormat("location.href=\"{0}\";", url);
            }

            if (!string.IsNullOrEmpty(otherScripts))
            {
                sb.AppendFormat("{0};", otherScripts);
            }

            page.ClientScript.RegisterStartupScript(page.GetType(), "", sb.ToString(), true);
        }
        #endregion

        #region## Jquery彈框 (BlockUI)
        /// <summary>
        /// 功能:Jquery插件彈框
        /// </summary>
        /// <param name="alertContext">提示正文</param>
        public static void JQAlert(string alertContext)
        {
            JQAlertBase(alertContext, null);
        }

        /// <summary>
        /// 功能:Jquery插件彈框,從XML中得到提示信息
        /// </summary>
        /// <param name="tipId">XML文件中ID節點值</param>
        public static void JQAlertXml(string tipId)
        {
            JQAlert(GetTipDic(tipXmlPath, tipId));
        }

        /// <summary>
        /// 功能:Jquery插件彈框並跳轉
        /// </summary>
        /// <param name="alertContext">提示正文</param>
        /// <param name="url">跳轉URL</param>
        public static void JQAlertGo(string alertContext, string url)
        {
            JQAlertBase(alertContext, url);
        }

        /// <summary>
        /// 功能:Jquery插件彈框並跳轉,從XML中得到提示信息
        /// </summary>             
        /// <param name="tipId">XML文件中ID節點值</param>
        /// <param name="url">跳轉URL</param>
        public static void JQAlertGoXml(string tipId, string url)
        {
            JQAlertGo(GetTipDic(tipXmlPath, tipId), url);
        }

        /// <summary>
        /// 功能:Jquery插件彈出
        /// </summary>
        /// <param name="alertContext">提示正文</param>
        /// <param name="url">跳轉URL</param>
        private static void JQAlertBase(string alertContext, string url)
        {
            Page page = HttpContext.Current.Handler as Page;

            StringBuilder sb = new StringBuilder();

            sb.Append("$(function(){{");

            if (!string.IsNullOrEmpty(alertContext))
            {
                sb.AppendFormat(@"$.blockUI({{ message: '<br/><h1>{0}</h1><br/>',css: {{ width: ""600px"" }}, timeout: 2000 }});", alertContext);
            }

            if (!string.IsNullOrEmpty(url))
            {
                sb.AppendFormat("setTimeout(function() {{ $.unblockUI({{onUnblock: function(){{ location.href='{0}';}}  }}); }}, 2000);", url);
            }

            sb.Append("}});");

            page.ClientScript.RegisterStartupScript(page.GetType(), "", sb.ToString(), true);

        }
        #endregion

        #region## 根據ID從XML文件中獲取提示信息
        /// <summary>
        ///  根據ID從XML文件中獲取提示信息
        ///  進行XML文件依賴緩存
        /// </summary>
        /// <param name="filePath">XML提示文件路徑</param>
        /// <param name="tipId">XML文件中ID節點</param>
        /// <returns>提示信息</returns>
        private static string GetTipDic(string filePath, string tipId)
        {
            string tipStr = string.Empty;

            if (HttpRuntime.Cache["TipCache"] == null)
            {
                tipDic = new Dictionary<string, string>();

                string xmlPath = HttpContext.Current.Server.MapPath(filePath);
                XDocument doc = XDocument.Load(xmlPath);

                var language = doc.Descendants("language").First().Element("value").Value;

                var tipList = doc.Descendants("alerttip");

                foreach (var item in tipList)
                {
                    string id = item.Element("id").Value;
                    if (!tipDic.ContainsKey(id))
                    {
                        tipDic.Add(id, item.Element(language).Value);
                    }
                }

                CacheDependency dep = new CacheDependency(xmlPath);
                HttpRuntime.Cache.Insert("TipCache", tipDic, dep, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration);
            }
            else
            {
                tipDic = HttpRuntime.Cache["TipCache"] as Dictionary<string, string>;
            }

            if (tipDic.ContainsKey(tipId))
            {
                tipStr = tipDic[tipId];
            }

            return tipStr;
        }
        #endregion
    }
}
AlertHelper.cs 【展開查看詳細】

  

示例代碼(不完整)及截圖
  •  在頁面上放置了不同的按鈕響應不同的前后端代碼
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AlertTipSamples._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>前后端彈框示例,前后端提示信息</title>

    <script src="!js/jquery-1.7.2.min.js" type="text/javascript"></script>

    <script src="!js/jquery.blockUI.js" type="text/javascript"></script>

    <script src="!js/alert.js" type="text/javascript"></script>

    <style type="text/css">
        h1
        {
            margin: 0;
            padding: 0;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <hr />
        <input id="btnFrontend" type="button" value="前端提示(Windows)" />
        <br />
        <br />
        <input id="btnFrontendGo" type="button" value="前端提示並跳轉(Windows)" />
        <br />
        <br />
        <asp:Button ID="btnbackend" runat="server" Text="后端提示(Windows)" OnClick="btnbackend_Click" />
        <br />
        <br />
        <asp:Button ID="btnbackendGo" runat="server" Text="后端提示並跳轉(Windows)" OnClick="btnbackendGo_Click" />
        <br />
        <br />
        <br />
        <hr />
        <input id="btnJQFrontend" type="button" value="前端提示(Jquery)" />
        <br />
        <br />
        <input id="btnJQFrontendGo" type="button" value="前端提示並跳轉(Jquery)" />
        <br />
        <br />
        <asp:Button ID="btnJQbackend" runat="server" Text="后端提示(Jquery)" OnClick="btnJQbackend_Click" />
        <br />
        <br />
        <asp:Button ID="btnJQbackendGo" runat="server" Text="后端提示並跳轉(Jquery)" OnClick="btnJQbackendGo_Click" />
        <br />
        <br />
        <br />
        <hr />
    </div>
    </form>
</body>
</html>

<script type="text/javascript">
    $(function() {
        $('#btnFrontend').click(function() {
            alertXml(1);
        });

        $('#btnFrontendGo').click(function() {
            alertGoXml(1, "Dest.aspx");
        });

        $('#btnJQFrontend').click(function() {
            alertBlockUiXml(1);
        });

        $('#btnJQFrontendGo').click(function() {
            alertBlockUiGoXml(-1, "Dest.aspx");
        });
    })      
</script>
Default.aspx 【展開查看詳細】

 

using System;
using Utils;

namespace AlertTipSamples
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        /// <summary>
        ///  Windows彈框提示
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnbackend_Click(object sender, EventArgs e)
        {
            AlertHelper.AlertXml("-1");
        }

        /// <summary>
        /// Windows彈框提示並跳轉
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnbackendGo_Click(object sender, EventArgs e)
        {
            AlertHelper.AlertGoXml("-1", "Dest.aspx");
        }

        /// <summary>
        ///  Jquery彈框提示
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnJQbackend_Click(object sender, EventArgs e)
        {
            AlertHelper.JQAlertXml("-1");            
        }

        /// <summary>
        ///  Jquery彈框提示並跳轉
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnJQbackendGo_Click(object sender, EventArgs e)
        {
            AlertHelper.JQAlertGoXml("-1", "Dest.aspx");
        }

    }
}
Default.aspx.cs 【展開查看詳細】

 

示例截圖

 

示例下載

 示例下載:http://files.cnblogs.com/zhongweiv/AlertTipSamples.zip

 示例代碼Target Framework為:.NET Framework3.5^_^!

 

備注:因為是Demo有很多可優化的地方就省略了,XML文件也可以根據提示信息的多少或功能模塊決定是否分開放置!         


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM