1

我有一个 HTML 表,其中每一行都有用于切换数据库中每一行的状态位的按钮。假设 Javascript 不是一个选项,那么处理这个问题的“最佳实践”方式是什么?

我目前正在通过将每一行包装成这样的形式来处理它:

<table>
    <tr>
        <td>
            <form action="/FooArea/BarController/BazAction" id="frm0" name="frm0" method="post">
                 <span>Item 1</span>
                 <input type="submit" value="Toggle1" name="submitButton"  />
                 <input type="submit" value="Toggle2" name="submitButton"  />
                 <input type="hidden" name="itemID" value="1" />
            </form>
        </td>
    </tr>
    <tr>
        <td>
            <form action="/FooArea/BarController/BazAction" id="frm1" name="frm1" method="post">
                 <span>Item 2</span>
                 <input type="submit" value="Toggle1" name="submitButton"  />
                 <input type="submit" value="Toggle2" name="submitButton"  />
                 <input type="hidden" name="itemID" value="2" />
            </form>
        </td>
    </tr>
</table>

post 方法看起来像这样:

string buttonName = Request.Form["submitButton"];    
if (!String.IsNullOrEmpty(buttonName )) 
{
     int itemID = Convert.ToInt32(Request.Form["itemID"]);
     switch (buttonName )
     {
         case "Toggle1":
         DoSomething(itemID);
         break;

         case "Toggle2":
         DoSomethingElse(itemID);
         break;
     }
}

有更好的建议吗?一个页面上有 50 个表单很酷吗?我不知道..让我知道你在这种情况下在做什么。

4

4 回答 4

2

正如其他几个人所说,在没有 JavaScript 的情况下处理 POST 场景的最佳方法是一个只有必要值和一个提交按钮的小表单。基本上,您应该做的是创建一个辅助方法,该方法创建一个表单,其中包含隐藏字段中的必要 POST 值和一个提交按钮。例如,您可以使用如下方法:

<%= Html.PostLink("FooArea/BarController/BazAction", "Toggle1", new List<KeyValuePair<string, string>>{ new KeyValuePair<string, string>("itemId", 1), new KeyValuePair("action", "option1") }); %>

它看起来很冗长,但我试图让它尽可能通用。您可能可以List<KeyValuePair<string, string>>在渲染视图时在控制器中创建,因此您只需要调用一些东西

 <%= Html.PostLink("FooArea/BarController/BazAction", "Toggle1", Model.Values) %>

在处理帖子的操作方法中,您绑定到发布的 FormCollection,并检索其值itemIdaction确定要执行的操作,而不是检查Request.Form值。

辅助方法的实现可能如下所示:

public static string PostLink(this HtmlHelper helper, string postAction, string submitText, IEnumerable<KeyValuePair<string, string>> postValues)
{
    var form = new TagBuilder("form");

    // Setup basic properties like method, action
    form.Attributes.Add("method", "post");
    form.Attributes.Add("action", postAction);

    // Instantiate a stringbuilder for the inner html of the form
    var innerHtml = new StringBuilder();

    // Create and append hidden fields for the post values
    foreach(var value in postValues)
    {
        var hidden = new TagBuilder("input");
        hidden.Attributes.Add("type", "hidden");
        hidden.Attributes.Add("name", value.Key);
        hidden.Attributes.Add("value", value.Value);
        innerHtml.Append(hidden.ToString(TagRenderMode.SelfClosing));
    }

    // Create the submit button
    var submit = new TagBuilder("input");
    submit.Attributes.Add("type", "submit");
    submit.Attributes.Add("value", submitText);
    // Append it to the stringbuilder
    innerHtml.Append(submit.ToString(TagRenderMode.SelfClosing));

    // Set the InnerHtml property of the form, and return it
    form.InnerHtml = innerHtml.ToString();
    return form.ToString(TagRenderMode.Normal);
}
于 2010-02-02T16:31:32.943 回答
0

这似乎是一些 JQuery 和 Ajax 功能的主要案例。但是如果 javascript 不是一个选项,那么我认为将每个都包装在一个表单中可能是最简单的解决方案。

于 2010-02-02T15:50:09.900 回答
0

当我需要做这样的事情时,我的做法和你在这里做的差不多。在一个视图中拥有多个表单是没有问题的。就像在一个视图中有多个链接(但它们使用 POST 而不是 GET)。我猜许多 .net 开发人员认为这是错误的,因为 web 表单只有一个表单标签。在您的情况下,我什至会为每个提交按钮创建更多表单,因为它们似乎在做不同的事情。我认为必须检查控制器中按钮的名称是代码异味。如果他们执行诸如激活/停用之类的操作,您可能应该将其发布为 bool 或其他内容,并将两种表单发布到相同的操作。

于 2010-02-02T15:55:21.530 回答
0

我认为从技术上讲,这是最好的方法。从可用性的角度来看,您可以质疑这是否是最好的方法。列表中的 20 多个项目可能会非常混乱。但是当然,我真的不知道你在编程什么:)

我同意 Mattias 关于为激活和停用按钮创建不同操作的观点。这样,您就不必使用 switch 语句。

于 2010-02-02T16:05:51.477 回答