浅谈ViewState原理

  首先要知道,只有设定了name的input,textarea,select,它们的value属性才会被提交给服务器,而即使是设定了name 的表单元素,它能提交给服务器的也只能是value属性,其他的比如大小,背景色等也是无法提交给服务器的,所以要将这些值存在一个隐藏的字段中。
举两个例子来解释一下:
1. input(textbox)版本的自增,由于textbox本身就是input表单元素,所以它本身的value值会提交给服务器,当点击按钮,触发自增事件,value值发生改变,相应的textbox中的值也会发生改变。

2.div版的自增,由于div本身没有name,所以无法将div中的innertext值提交给服务器,所以要想实现自增效果,必须要设置一个input的隐藏(hidden)字段,并且将它的value属性设为与div中的innertext相同的值,这样当点击按钮,触发某个事件的时候,input隐藏字段将value值提交给服务器,当value值发送改变时,input隐藏字段中的value值也发生了变化,而由于div中的innertext值与value值相同,所以显示的是div中的值发生了变化,从而达到了div的自增,而实际上div只不过是达到了显示input中隐藏字段的value值。

也就是说,在div版本自增中添加 的<input type="hidden" name="num" value="@value">这条语句,实现的效果就是ViewState。

<form action="自增.ashx">
    <input type="hidden" name="ispostback" value="true" />
    <input type="hidden" name="num" value="@value" />
    <div>@value</div>
    <input type="submit" value="自增" />
</form>


ashx代码:
public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "text/html";
        string ispostback=context.Request["ispostback"];
        string value = "0";
        if(ispostback=="true")
        {
            value=context.Request["num"];
            int i = Convert.ToInt32(value);
            i++;
            value = i.ToString();
        }
       
        string fullpath = context.Server.MapPath("自增.htm");
        string webhtml = System.IO.File.ReadAllText(fullpath);
        webhtml = webhtml.Replace("@value",value);
        context.Response.Write(webhtml);
    }

转载于:https://www.cnblogs.com/Jove-wei/archive/2011/11/30/2269684.html

猜你喜欢

转载自blog.csdn.net/weixin_33736649/article/details/93517449