使用GET方法

时间:2012-09-28 15:27:10

标签: asp.net webforms get

我有一个页面,其中包含一个表单(即向页面提交数据的元素)和几个ASP控件。 ASP控件必须包含在带有form的{​​{1}}标记中,尽管它们与提交数据无关,而且无关的runat="server"标记比无用更糟糕。这个form必须包含所有控件,这意味着它还将包含执行有用工作的实际表单的标记。

这个form有一个form的方法和一个非本页的动作,它们都不能与ASP很好地配合。我尝试在ASP样板中嵌套正确的表单标签,但是浏览器不会接受它,可能是因为规范明确禁止它。此表单的字段是通过Javascript生成的,因此无法将其转换为ASP控件。

可以解决这个问题的事情:

  • 每页有多个无用的ASP表单,因此它们可以严格限定范围。 (由ASP禁止)
  • 嵌套表单,以便功能表单仍然存在(由HTML禁止)
  • 一个新的控件,它可以取代空白的ASP get,而不会将无用的crud转移到标记中。 (这可能吗?)
  • 从有用的表单中删除标记,并在回发时手动浏览POST数据以确定应该作为GET提交的内容,然后重定向。在每个页面都有一个有用的形式。
  • 一个复杂的半自动执行上述系统,由于表单字段不是ASP控件,这可能是不切实际的。
  • 完全放弃ASP控件。

想法?

1 个答案:

答案 0 :(得分:0)

新的事件处理程序:

public void GetRequest(object sender, CommandEventArgs e)
{
    string url = string.IsNullOrEmpty(e.CommandArgument as string)
        ? Request.Url.AbsolutePath
        : (string)e.CommandArgument;

    var query = Request.Form.ToDictionary()
        .Where(kv => kv.Key.StartsWith(e.CommandName + "$"))
        .Select(kv => string.Format("{0}={1}",
            Server.UrlEncode(kv.Key.Substring(kv.Key.IndexOf("$") + 1)),
            Server.UrlEncode(kv.Value)));

    string destination = string.Format("http://{0}{1}{2}{3}",
        Request.Url.Authority,
        Page.ResolveUrl(url),
        query.Any() ? "?" : "",
        string.Join("&", query));

    Response.Redirect(destination);
}

在aspx中:

<div class="form" id="filters-form">
    <div><input type="hidden" name="filters$OrderBy" value="<%= Orderings.ToSortString() %>" /></div>
    <fieldset id="filters"><!-- Will be filled in by javascript --></fieldset>
    <fieldset id="controls">
        <div>
            <button type="button" id="add-filter">New Filter</button>
            <asp:Button runat="server" Text="Apply Filters" OnCommand="GetRequest" CommandName="filters" />
        </div>
    </fieldset>
</div>