Передача выбора флажка через действие - PullRequest
2 голосов
/ 11 ноября 2011

У меня есть несколько флажков, которые используются для пользователя, чтобы указать, какие столбцы они хотят видеть в сетке:

columnselector

На данный момент каждый флажок имеет свой собственный ключ (который, по сути, является именем метки) и объявлен так:

@Html.CheckBox(column.Key,
               (Request.Form[column.Key] == null ? true : 
                Request.Form[column.Key].Contains("true")),
               new { @class = "columnSelector" })

@Html.Label(column.HeaderText)

Проблема заключается в том, что я должен получать значения из коллекции форм в своем действии, так как в противном случае мне нужно было бы иметь параметр bool для каждого флажка селектора столбцов. В качестве альтернативы я подумал, что могу назвать их все «columnselection» или что-то в этом роде, и тогда оно будет передано моему действию как массив значений, однако тогда я потеряю контекст значения, поскольку у меня нет ключа столбца.

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

Есть какие-нибудь мысли о том, как я мог бы сделать этот материал для выбора столбцов простым и понятным способом?

1 Ответ

1 голос
/ 11 ноября 2011

Метод Html.CheckBox имеет странную реализацию.Флажки будут иметь уникальное значение name и, по сути, значение true/false.Это сделано для того, чтобы значение легко отображалось в параметре bool в действии.

Как вы, очевидно, заметили, это создает сложную ситуацию, когда ваши флажки являются динамическими.

Решение состоит в том, чтобы создать свои собственные флажки, все с использованием общих name и имеющих уникальные value s.Они очень хорошо отобразятся в вашем действии!

См. Также этот вопрос, для некоторых замечательных примеров и объяснений .

Вот необходимое действие:

public ActionResult SetSelectedColumns(string[] selectedColumns) {
    // selectedColumns will contain the keys of all the checked columns.
}

А вот как правильно настроить отображение HTML:

<input type="checkbox" name="selectedColumns" value="@column.Key" @(column.Selected ? "checked='checked'" : "") />

Я настоятельно рекомендую включить эту функцию в метод расширения, чтобы вы также могли включить ModelState и htmlAttributes.Вот моя непроверенная попытка:

    public static HtmlString CheckBoxAlt(this HtmlHelper html, string name, string value, bool selected, object htmlAttributes)
    {
        var tag = new TagBuilder("input");
        if (htmlAttributes != null)
            tag.MergeAttributes(new RouteValueDictionary(htmlAttributes));
        tag.MergeAttribute("type", "checkbox");
        tag.MergeAttribute("name", name);
        tag.MergeAttribute("value", value);
        // Determine if this check should be selected:
        var state = html.ViewData.ModelState[name];
        if (state != null)
        {
            var values = (string[])state.Value.ConvertTo(typeof(string[]));
            selected = Array.IndexOf(values, value) != -1;
        }
        if (selected)
            tag.MergeAttribute("checked", "checked");

        return new HtmlString(tag.ToString(TagRenderMode.SelfClosing));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...