【问题标题】:asp.net form runat serverasp.net 表单 runat 服务器
【发布时间】:2010-12-16 14:12:26
【问题描述】:

我在每个页面上都有一个搜索表单,因此我将它放在母版页上。将runat=server 添加到该表单后,我现在无法使用在服务器上运行的其他表单;)

人们通常如何解决这个问题?

一个想法是用一个表单 runat=server 包围整个页面,但是我必须在母版页中包含代码,即使是那些仅在一个子页面上使用的表单(例如联系人)。

人们通常如何解决这个问题?

thnx

【问题讨论】:

    标签: c# asp.net forms runatserver


    【解决方案1】:

    这通常被认为是 ASP.NET 上最成问题的设计决策之一。可悲的是,您有点固守这种每页一个表单的原则。

    您可能希望拥有多个表单的一个原因是浏览器会将默认按钮设置为提交按钮。输入您的搜索框并按 Enter 键的人不应该提交主表单(假设那是登录页面),而是提交搜索按钮的小表单。

    解决此问题的最简单且“标准”的方法是使用 asp:Panel 并设置 DefaultButton 属性。这应该围绕包含搜索字段和搜索按钮的部分。

    不必担心从母版页内部对整个页面的<form> 进行编码。这是一个常见的设计。大多数服务器控件都需要一个表单,所以为什么不简单地包含它呢:它应该在那里。

    【讨论】:

    • 我明白了。我只是认为对将在母版页的一页上的表单进行编码是错误的。不知何故不适合我:P 但正如你所说,这是常见的设计,也许我应该。谢谢。
    • 在 ASP.NET 开始时,人们常常不同意为什么 MS 选择这种每页只有一个表单的设计。它有优点(简单有利于复杂)和缺点(某些传统方法需要重新思考)。也有一些变通方法,但总而言之,我的建议是:坚持这种设计并使用它的特性,只有在你真正必须并完全理解其后果时才开始构建“非默认”设计模式。
    【解决方案2】:

    我建议您在母版页上使用不带 runat=server 的搜索 html 表单,例如

    <form action="Search.aspx" method="get">
      <input type="text" name="q" /><input type="submit" />
    </form>
    

    使用method=get 可以获取搜索的URL。然后在 Search.aspx 的代码隐藏中执行任何您需要的查询:

    public void Page_Load(object sender)
    {
      string q = Context.Request.QueryString["q"];
      /*...*/
    }
    

    【讨论】:

      【解决方案3】:

      第一个问题是,为什么要拥有多个 runat="server" 表单?

      您仍然可以在页面上没有runat="server" 的表单,或使用Button 控件上的PostBackUrl 属性来发布到不同的ASP.NET 页面。

      要在多步骤过程中收集数据,您可以查看 ASP.NET 向导控件,请参阅 Scott Guthrie 的 blog post here

      您也可以自行管理并使用 ASP.NET 面板,或使用已经提到的PostBackUrl 从 ASP.NET 页面导航到其他页面。

      【讨论】:

      • 好吧(不太确定你到底指的是什么 - 你为什么想要什么?) - 我必须对搜索进行一些复杂的解析,然后转到下一页。也对于联系人(例如)我想做一些事情,比如 db insert 可能然后转到下一页。
      • 啊,好的(编辑后)。好吧,我不想 :) 只是不确定如何将两种形式的代码分开。一个应该在母版页上,因为它总是被使用,另一个在单页上(因为它只在那里使用)。 Abel(在此页面上)提到,将所有代码都放在母版页上是可以的,即使第二种形式只会在一个子页面上使用。
      • "all the code" 我的意思是 &lt;form&gt; 标签。习惯上将它们放在 Master 中,只是因为无论如何您都必须拥有它们(提供一些例外情况)。就个人而言,我经常使用两级 Master:一个干净的无形 Root Master,以及几个从 Root Master 继承的子 Master(master 可以嵌套)。这样我就可以决定每页我需要什么,而不会失去任何灵活性。这取决于您的情况,最终最合适的是什么。
      猜你喜欢
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 2011-06-03
      • 1970-01-01
      相关资源
      最近更新 更多