ASP.NET MVC 2: лучший способ обрабатывать несколько кнопок в каждой строке таблицы HTML? - PullRequest
1 голос
/ 02 февраля 2010

У меня есть таблица 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>

И метод записи выглядит примерно так:

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 ]

2 голосов
/ 02 февраля 2010

Лучший способ обработки сценариев POST без JavaScript - это, как заявили несколько других, крошечная форма с только необходимыми значениями и только одной кнопкой отправки. По сути, вам нужно создать вспомогательный метод, который создает форму с необходимыми значениями 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 и извлекаете значения itemId и action, чтобы определить, что делать, вместо проверки 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);
}
0 голосов
/ 02 февраля 2010

Когда мне нужно сделать что-то подобное, я делаю это почти так же, как вы делаете здесь. Нет проблем иметь несколько форм в одном представлении. Это как иметь несколько ссылок в одном представлении (но они используют POST вместо GET). Я думаю, что многие разработчики .net считают, что это неправильно, потому что у веб-форм только один тег формы. В вашем случае я бы даже создал больше форм для каждой кнопки отправки, поскольку они, кажется, делают разные вещи. Я считаю, что необходимость проверки названия кнопки в контроллере является запахом кода. Если они делают что-то вроде активации / деактивации, вам, вероятно, следует опубликовать это как bool или что-то подобное, и обе формы отправляют на одно и то же действие.

0 голосов
/ 02 февраля 2010

Я думаю, что технически это лучший путь. С точки зрения удобства использования вы можете спросить, является ли это лучшим способом сделать это. Более 20 пунктов в списке могут привести к путанице. Но, конечно же, я не знаю, что вы программируете:)

Я согласен с Маттиасом в создании различных действий для кнопки активации и деактивации. Таким образом, вам не нужно использовать оператор switch.

0 голосов
/ 02 февраля 2010

Это похоже на лучший случай для некоторых функций JQuery и Ajax. Но если javascript не вариант, то я думаю, что оборачивать каждый из них в форму, возможно, самое простое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...