manbetx官方网站

【转】WebResource实现在起定义控件被内嵌JS文件。Asp.net自定义单选复选框控件。

九月 30th, 2018  |  买球网站manbetx

当类库中之资源  其他种类受到一旦使用 需要坐才行

用常用之jquery插件封装成控件也是独是的挑选

参考文献:WebResource实现在由定义控件被内嵌JS文件
 

下是力量的简要颜色,由于博客系统的界定没法完整演示最终效果,请下载示例查看

 

Asp.netWeb APIC#Javascript

  1. WebResource简介

 

   
ASP.NET(1.0/1.1)给咱们提供了一个开WebControl的编程模型,于是我们摆脱了asp里面的include模式的复用方式。不过1.0/1.1资的Web控件开发模型对于拍卖没有image、css等标资源的零部件还算比较得心应手,script虽然多辰光啊是外表资源,但每当开控件的时候我们习惯把script使用Page.Register…Script()来放开模块,因为紧凑的事物再有益我们复用,用一个dll就好化解问题。

1.新建类库项目,创建数量源类

    ASP.NET 2.0资的Web
Resources管理模型,很好的化解了image、css、script等标资源的管住问题。WebResourceAttribute是一个metedata
attribute,它可以吃我们访问到放到assembly中的资源。

    [Serializable]
    public class Select2Item
    {
        public bool Selected { get; set; }

        public string Text { get; set; }

        public string Value { get; set; }

        public Select2Item() { }

        public Select2Item(string text, string value)
        {
            this.Text = text;
            this.Value = value;
        }

        public Select2Item(string text, string value, bool selected)
        {
            this.Text = text;
            this.Value = value;
            this.Selected = selected;
        }
    }
  1. WebResource的使用

2.创立控件类CheckList,继承和WebControl,并定义 public
List<Select2Item> Items数据项属性。

    在运内嵌的server
side资源时,首先必须管资源文件Embedded内嵌到我们的assembly程序集中,然后在Application中之AssemblyInfo.cs文件中上加上这些文件的援。具体过程:

3.引入脚本文件与体制文件

① 文件内嵌:将所而内嵌的文件【生成操作】属性更改为——》坐的资源

 a.创建脚本或样式文件,设置文件之属性-生成操作-嵌入的资源

 图片 1 

 图片 2

② 文件内嵌完成后,下面就是用针对已经内嵌的公文进行引用。

 b.需要在namespace上补偿加标记 [assembly:
WebResource(“命名空间.文件夹名.文件称”, “mime类型”)]

援方法来少数种植:

 如:

主意同样:找到AssemblyInfo.cs文件,添加代码:

    [assembly: WebResource(“Control.Style.checklist.css”,
“text/css”,PerformSubstitution =
true)]
    [assembly: WebResource(“Control.Scripts.checklist.js”,
“application/x-javascript”)]

[assembly: WebResource(“eWebapp.Upload.upLoad.js”, “text/javascript”)]

 如果css文件里有图片的话,同样用图片设置也停放的资源,在css中的写法为<%=WebResource(“命名空间.文件夹名.文件称”)%>

还要,还得丰富命名空间using System.Web.UI;

 PerformSubstitution
表示嵌入式资源的处理过程中是否分析任何Web 资源
URL,并因而到该资源的整路径替换。

 图片 3 

c.重写protected override void
OnPreRender(EventArgs e),引入嵌入的剧本或样式文件

 

 
if(Page!=null) Page.Header.Controls.Add(LiteralControl),将<script><link>标签放到LiteralControl中,然后用LiteralControl添加到Page.Header中,最后当页面里而便会看出引入的<script><link>标签。

术二:在旁一个class文件被,均只是长引用的宣示;

图片 4图片 5

[assembly: WebResource(“eWebapp.Upload.upLoad.js”, “text/javascript”)]

        protected override void OnPreRender(EventArgs e)
        {
            if (this.Page != null)
            {
                StringBuilder sbb = new StringBuilder();
                sbb.Append(string.Format(STYLE_TEMPLATE, Page.ClientScript.GetWebResourceUrl(this.GetType(), "HandControl.Style.checklist.css")));
                sbb.Append(string.Format(SCRIPT_TEMPLATE, Page.ClientScript.GetWebResourceUrl(this.GetType(), "HandControl.Scripts.checklist.js")));

                bool hascss = false;
                LiteralControl lcc = new LiteralControl(sbb.ToString());
                lcc.ID = "lccheck";
                foreach (Control item in Page.Header.Controls)
                {
                    if (item.ID == "lccheck")
                        hascss = true;
                }
                if (!hascss)
                    Page.Header.Controls.Add(lcc);
            }
            base.OnPreRender(e);
        }

(放在最高级namespace外就尽)

View Code

 

 

参数说明:第一独凡是资源的名,第二个是资源的mime-type名。
资源的名命名一般包括三独组成部分:<缺省之命名空间.><扩展命命名空间.><文件名>
缺省的命名空间就是路之命名空间,文件称就是是资源文件的称呼。
中等扩展命名空间就是项目蒙之目结构.如果你的资源文件就以档次之根目录下,扩展命名空间就不需要了,直接这样写就得了.
<缺省的命名空间.> <文件名>.
但是一旦您以列面临来目录结果的语,就要用扩展命名空间了。例如,假设以上资源文件在目录Js下:

4.更写控件的protected override void Render(HtmlTextWriter writer)方法

[assembly: System.Web.UI.WebResource(“eWebapp.Upload / js / upLoad.js
“, ” text/javascript “)]

 这里根本是渲染控件的html,根据你的控件而早晚。

 

图片 6图片 7

③ 以上准备工作形成后,下面就可得到内嵌的资源文件了。

        protected override void Render(HtmlTextWriter writer)
        {
            if (Items.Count > 0)
            {
                writer.Write("<div id='div" + this.ClientID + "' class='c01-tag-div' mul='" + (Multiple == true ? "1" : "0") + "'>");
                if (Multiple == false)
                    writer.Write("<input name='tb" + this.ClientID + "' type='hidden' value='" + Items[0].Value + "' />");
                else
                    writer.Write("<input name='tb" + this.ClientID + "' type='hidden' />");
                bool first = true;
                foreach (var item in Items)
                {
                    if (Multiple == false)
                    {
                        if (item.Selected && first)
                        {
                            writer.Write("<a title='" + item.Text + "' class='c01-tag-item c01-tag-select' val='" + item.Value + "' tag='Y'>" + item.Text + "</a>");
                            first = false;
                        }
                        else
                        {
                            writer.Write("<a title='" + item.Text + "' class='c01-tag-item' val='" + item.Value + "' tag='N'>" + item.Text + "</a>");
                        }
                    }
                    else
                    {
                        if (item.Selected)
                            writer.Write("<a title='" + item.Text + "' class='c01-tag-item c01-tag-select' val='" + item.Value + "' tag='Y'>" + item.Text + "</a>");
                        else
                            writer.Write("<a title='" + item.Text + "' class='c01-tag-item' val='" + item.Value + "' tag='N'>" + item.Text + "</a>");
                    }
                }
                writer.Write("</div>");
            }
        }

     protected override void
AddAttributesToRender(System.Web.UI.HtmlTextWriter writer)

View Code

     {

5.添加GetSelected方法,返回List<Select2Item>,添加GetSelectValue,返回String(多选以,号隔开)

         writer.AddAttribute(“onchange”, “newUpload(this);”);

图片 8图片 9

         base.AddAttributesToRender(writer);

        public List<Select2Item> GetSelected()
        {
            if (Page != null)
            {
                var values = Page.Request.Form["tb" + this.ClientID].Split(',');
                var res = Items.Where(t => values.Contains(t.Value)).ToList();
                foreach (var item in Items)
                {
                    if (res.Contains(item))
                    {
                        item.Selected = true;
                    }
                    else
                    {
                        item.Selected = false;
                    }
                }
                return res;
            }
            else
            {
                return null;
            }
        }

     }

View Code

注意:此段主要是啊控件追加onchange事件,也堪经当创造界面时直抬高,如:

图片 10图片 11

f.Attributes.Add(“onchange”, “javascript:newUpload(this);”);

        public string GetSelectValue()
        {
            if (Page != null)
            {
                return Page.Request.Form["tb" + this.ClientID];
            }
            return "";
        }

       public class Upload : System.Web.UI.WebControls.WebControl

View Code

       {

6.保存状态

              protected override void OnPreRender(EventArgs e)

若要重写少单道protected override object SaveViewState() 、protected
override void LoadViewState(object
savedState),旨在以Items数据项属性保存至ViewState

              {

图片 12图片 13

                 Page.ClientScript.RegisterClientScriptInclude(“upLoad”,
                      
Page.ClientScript.GetWebResourceUrl(this.GetType(),
“eWebapp.Upload.upLoad.js”));

        protected override object SaveViewState()
        {
            var valuestr = Page.Request.Form["tb" + this.ClientID];
            if (!string.IsNullOrEmpty(valuestr))
            {
                var values = valuestr.Split(',');
                var temp = Items.Where(t => values.Contains(t.Value)).ToList();
                foreach (var item in temp)
                {
                    item.Selected = true;
                }
            }
            return new object[] { base.SaveViewState(), Items };
        }

        protected override void LoadViewState(object savedState)
        {
            object[] vState = (object[])savedState;
            if (vState[0] != null)
                base.LoadViewState(vState[0]);
            if (vState[1] != null)
                Items = (List<Select2Item>)vState[1];
        }

                      base.OnPreRender(e);

View Code

           }

7.单选同复选的装,在js中决定

   }

补给加属性

④ 生成的页面时这样的:

[Description(“获取与安多选择”), DefaultValue(true), Browsable(true),
Category(“杂项”)]
public bool Multiple { get; set; }

<script src="/WebResource.axd?d=SfSlYQLv-RU-lSlTT0gProNFY7jkKs9lj16Lbul83Y0oicWZcUHLXICfPyGF1YsG0&amp;t=633813613197656250" type="text/javascript"></script>

于OnPreRender代码中你晤面发现Multiple属性会潜移默化div的mul属性值,从而判断是否多选(默认多选)

其中的<script src=”/WebResource.axd?d=…… 就是指向台本资源的调用。

8.其它说明

 备注:

private static readonly string STYLE_TEMPLATE = “<link
href=\”{0}\” rel=\”stylesheet\” type=\”text/css\” />\r\n”;
private static readonly string SCRIPT_TEMPLATE = “<script
type=\”text/javascript\” src=\”{0}\”></script>\r\n”;

 1. 内嵌资源的文书称类似eWebapp.Upload.upLoad.js

效果图:

       Syntax : eWebapp.Upload/ upLoad.js –>eWebapp.Upload.upLoad.js

图片 14图片 15

     
资源名必须和AssemblyInfo.cs文件被宣称的同。如果资源名错误或文件不存,在地点被生成的步就达成不交预期结果。

 2. 资源文件要内厝程序集中。

 3. 返回的资源文件Url分析:

          WebResource.axd?d=加密后底标识符 & T = 时间戳值。
          其中:

           ” d ” 代表要 Web 资源。  (encrypted identifier)
           ” t ” 是 timestamp 对程序集,
这促进在规定要已经指向资源的改请求。

 

小提示:

1、  看到网上有人说这么不管用,原因是VS默认的命名空间做了不良。

题材讲述:VS会活动将default namespace加到资源文件前。

解决:假使拿默认名称空间改也空就可以了。

可,在研究的经过被,我并不曾遇到这个问题。或许要实在做不成为,也非了解哪里错了,不妨用反编译工具Reflector来查转转变的资源文件是否正确。

标签:, ,

Your Comments

近期评论

    功能


    网站地图xml地图