ASP.NET(VB)表单值获取失败及两种解决方案原理咨询
关于ASP.NET表单提交中name属性与runat="server"的运行机制解释
一、添加runat="server"的运行机制
- 给HTML控件加上
runat="server"后,它就成为ASP.NET服务器端控件,后台会生成对应的.NET类实例(比如<input>会对应HtmlInputText或TextBox对象)。 - 在页面回发(表单提交)的生命周期中,ASP.NET会自动扫描HTTP请求的
Request.Form集合,把对应控件的提交值填充到服务器端控件的属性里(比如Text属性)。 - 如果你用了模型绑定(绑定GuestResponse这类对象),ASP.NET的模型绑定系统会直接从服务器端控件的属性中提取数据,自动赋值给模型对象的对应属性,所以你不用手动去请求集合里取值。
- 你之前遇到的
rsvp.willAttend.Value报错,本质是没加runat="server"时,后台不存在对应服务器端控件实例,willAttend为Nothing,访问Value自然触发空引用异常。
二、添加name属性的运行机制
- 纯HTML控件(无
runat="server")不会被ASP.NET服务器端控件系统管理,但HTML表单的规则是:只有带name属性的控件,其值才会被打包进HTTP请求的表单数据,发送到服务器。 - 当你用模型绑定的时候,ASP.NET会直接去
Request.Form集合里查找与模型属性名匹配的name键值,把对应的值填充到GuestResponse对象的属性中,这样对象属性就不会是Nothing。 - 举个例子:如果GuestResponse有
Email属性,只要HTML输入框的name="Email",模型绑定就会自动把Request.Form["Email"]的值赋值给GuestResponse.Email。
两者的核心区别
runat="server"控件受ASP.NET全程管控,支持视图状态(ViewState)、服务器端事件(比如OnClick)等功能,但会增加页面的ViewState开销。- 仅添加
name属性的纯HTML控件更轻量,无ViewState开销,适合不需要服务器端事件处理的场景,但需要确保name属性值和模型属性名一一匹配,否则无法自动绑定。
内容的提问来源于stack exchange,提问作者GiorgioC
相关产品推荐
相关产品推荐

