0

我正在使用 ASP.net 和 VB.Net 作为 Visual Studio 2012 web 中的代码开发一个非常简单的数据输入应用程序(在引导程序中)。

假设我有以下 html 来获取名字:

   <form id="form1" runat="server">
    <div style="padding:20px">
      <div class="form-group">
        <label for="firstname">Firstname</label>
        <input type="text" class="form-control" id="firstname" name="firstname" placeholder="" style="max-width:450px" maxlength="60" />
        <small class="text-muted">Enter your first name.</small>
      </div>
      <button runat="server" type="submit" class="btn btn-primary" onserverclick="btnSubmit_ServerClick" >Submit</button>

    </div>
  </form>

以及处理其值的相应代码:

Protected Sub btnSubmit_ServerClick(sender As Object, e As EventArgs)
    Dim fname As String = Request.Form("firstname").ToString
End Sub

假设我不想runat="server"在我的 html 名字字段中使用。我看到Request.Form("firstname").ToString只有在我设置了标签时才有效name="firstname"。如果我只设置了id标签(而不是name标签),它不会考虑它;在我的情况下,如果我只有<input type="text" class="form-control" id="firstname" placeholder="" style="max-width:450px" maxlength="60" />Request.Form("firstname")我的服务器端,返回 NULL。

我也尝试Request.Form没有运气。我看到该集合NameValueCollection由仅设置name标签的组件填充。

我的问题是,是否可以更改我的服务器代码以使用他们只设置了 ID 的 html 组件?

4

1 回答 1

2

当您选择不使用服务器端控件时,您将使用读取值的请求收集方法。

后面的代码将只能读取发送到后端的数据。如果您在您喜欢的浏览器的“网络”选项卡中检查您的请求(提交表单时请求的页面),您会发现一个显示已发送数据的部分。而且由于您没有在该输入字段上设置名称,因此数据不会发送到服务器。这就是为什么你无法阅读它。ID 对发送到服务器的内容没有影响。ID 仅用于客户端使用。添加 Runat="server" 时它“工作”的原因是因为框架将信息添加到名为“__VIEWSTATE”(或其他内容)的秘密隐藏输入字段中。

所以最后,HTML 的工作方式是,当您提交表单时,所有输入元素都以表单 name=value 的形式发送,并且由于您省略了名称,因此不会发送任何数据。

就像您帖子下方的评论所建议的那样,您确实应该考虑使用服务器端控件(runat="server")或将名称标签添加到您的表单元素中。

我知道很多人不喜欢 asp.net 网络表单(实际上我也不是粉丝),但还有其他选择——逻辑上的转变是改用 asp.net mvc。无论你做什么,如果你选择退出框架细节,你必须遵守 html5 标准。

祝你好运 :)

于 2016-06-03T09:14:16.483 回答