-2

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

form有一个方法get和一个not-this-page 的动作,它们都不能很好地与ASP 配合使用。我尝试在 ASP 样板中嵌套正确的表单标签,但浏览器不会接受它,可能是因为它被规范明确禁止。这个表单的字段是通过Javascript生成的,所以不能变成ASP控件。

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

  • 每页有多个无用的 ASP 表单,因此它们的范围很窄。(ASP 禁止)
  • 嵌套表单,使功能性表单仍然存在(HTML 禁止)
  • 一种新的控件,可以代替空洞的 ASP form,而不会将无用的杂物倾倒到标记中。(这可能吗?)
  • 从有用的表单中删除标签并在回发时手动检查 POST 数据,以确定应该作为 GET 提交的内容,然后重定向。在每个页面上都有一个有用的表格。
  • 半自动执行上述操作的复杂系统,考虑到表单字段不是 ASP 控件,这可能是不切实际的。
  • 完全放弃 ASP 控件。

想法?

4

1 回答 1

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>
于 2012-10-03T13:04:39.533 回答