Как обработать флажки в ASP.NET формы MVC?

247
задан Uwe Keim 10 May 2018 в 20:11
поделиться

10 ответов

HTML. CheckBox делает что-то странное - при просмотре источника на получающейся странице Вы будете видеть, что существует <input type="hidden" /> сгенерированный вместе с каждым флажком, который объясняет "истинные ложные" значения, Вы видите каждый элемент формы.

Попытка это, которое определенно работает над ASP.NET Бета MVC, потому что я только что попробовал его.

Помещенный это в представление вместо того, чтобы использовать HTML. CheckBox ():

<% using (Html.BeginForm("ShowData", "Home")) {  %>
  <% foreach (var o in ViewData.Model) { %>
    <input type="checkbox" name="selectedObjects" value="<%=o.Id%>">
    <%= o.Name %>
  <%}%>
  <input type="submit" value="Submit" />
<%}%>

Ваши флажки все называют selectedObjects, и value из каждого флажка GUID соответствующего объекта.

Тогда сообщение к следующему действию контроллера (или что-то подобное, которое делает что-то полезное вместо Ответа. Запишите ())

public ActionResult ShowData(Guid[] selectedObjects) {
    foreach (Guid guid in selectedObjects) {
        Response.Write(guid.ToString());
    }
    Response.End();
    return (new EmptyResult());
}

, Этот пример просто запишет GUID флажков, которые Вы установили; ASP.NET MVC отображает значения GUID установленных флажков в Guid[] selectedObjects параметр для Вас, и даже анализирует строки от Запроса. Набор формы в instantied объекты GUID, которые я думаю, довольно хорош.

262
ответ дан Dylan Beattie 23 November 2019 в 03:02
поделиться

Вот то, что я делал.

Представление:


<input type="checkbox" name="applyChanges" />

Контроллер:


var checkBox = Request.Form["applyChanges"];

if (checkBox == "on")
{
...
}

я нашел HTML.* вспомогательные методы, не настолько полезные в некоторых случаях, и что я был более обеспеченным выполнением его в простом HTML. Этот являющийся одним из них, другой, который приходит на ум, является переключателями.

Редактирование: это находится на Предварительном просмотре 5, очевидно, YMMV между версиями.

25
ответ дан mmacaulay 23 November 2019 в 03:02
поделиться

Необходимо также использовать <label for="checkbox1">Checkbox 1</label>, потому что затем люди могут нажать на текст метки, а также сам флажок. Его также легче разработать и по крайней мере в IE это будет выделено, когда Вы снабдите вкладками посредством средств управления страницы.

<%= Html.CheckBox("cbNewColors", true) %><label for="cbNewColors">New colors</label>

Это не просто, 'о, я мог сделать это' вещь. Это - значительное пользовательское улучшение опыта. Даже если не все пользователи будут знать, что они могут нажать на маркировку, то многие будут.

49
ответ дан Simon_Weaver 23 November 2019 в 03:02
поделиться

В случае, если Вы задаетесь вопросом, ПОЧЕМУ они вставляют скрытое поле с тем же именем как флажок, причина следующие:

Комментарий из исходного кода MVCBetaSource\MVC\src\MvcFutures\Mvc \ Рендеринг ButtonsAndLinkExtensions.cs

еще <input type="hidden".../> для флажков. Это обращается к сценариям, куда флажки непроверенные не отправляются в запросе. Отправка скрытого входа позволяет знать, что флажок присутствовал на странице, когда запрос был отправлен.

я предполагаю негласно, что они должны знать это для привязки к параметрам на методах действия контроллера. У Вас могла затем быть булевская переменная с тремя состояниями, которую я предполагаю (связанный с nullable bool параметром). Я не попробовал его, но я надеюсь, что это - то, что они сделали.

54
ответ дан Simon_Weaver 23 November 2019 в 03:02
поделиться

HtmlHelper добавляет скрытый вход для уведомления контроллера о состоянии Unchecked. Таким образом иметь корректное проверенное состояние:

bool bChecked = form[key].Contains("true");
95
ответ дан Andrea Balducci 23 November 2019 в 03:02
поделиться

Эта проблема происходит в выпуске 1.0 также. HTML.Checkbox () вызывает добавление другое скрытое поле с тем же именем / идентификатором, что и ваш оригинальный флажок. И, как я пытался загрузки массива флажков с помощью документа. GTELEMTENTENTSBYNAMENAME (), вы можете догадаться, как все становится запутанным. Это странная.

4
ответ дан 23 November 2019 в 03:02
поделиться

Я также хотел бы отметить, что вы можете присвоить каждому флажку другое имя, и это имя будет частью параметров actionresults.

Пример,

Представление:

 <%= Html.CheckBox("Rs232CheckBox", false, new { @id = "rs232" })%>RS-232

 <%= Html.CheckBox("Rs422CheckBox", false, new { @id = "rs422" })%>RS-422

Контроллер:

public ActionResults MyAction(bool Rs232CheckBox, bool Rs422CheckBox) {
    ...
}

Значения из представления передаются действию, поскольку имена совпадают.

Я знаю, что это решение не идеально для вашего проекта, но подумал, что выскажу эту идею.

6
ответ дан 23 November 2019 в 03:02
поделиться

Похоже, они предпочитают читать только первое значение, поэтому это «истина», когда флажок установлен, и «ложь», когда только скрытые значение включено. Это легко получить с помощью такого кода:

model.Property = collection["ElementId"].ToLower().StartsWith("true");
10
ответ дан 23 November 2019 в 03:02
поделиться

@ Дилан Битти Отличная находка !!! Большое спасибо. Чтобы расширить еще больше, этот метод также отлично работает с подходом модели представления. MVC настолько крут, что он достаточно умен, чтобы привязать массив Guids к свойству с тем же именем, что и объект Model, привязанный к View. Пример:

ViewModel:

public class SampleViewModel
{
    public IList<SampleObject> SampleObjectList { get; set; }
    public Guid[] SelectedObjectIds { get; set; }

    public class SampleObject
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
    }
}

View:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Sample View</h2>
<table>
    <thead> 
        <tr>
            <th>Checked</th>
            <th>Object Name</th>
        </tr>
    </thead> 
<% using (Html.BeginForm()) %>
<%{%>                    
    <tbody>
        <% foreach (var item in Model.SampleObjectList)
           { %>
            <tr>
                <td><input type="checkbox" name="SelectedObjectIds" value="<%= item.Id%>" /></td>
                <td><%= Html.Encode(item.Name)%></td>
            </tr>
        <% } %>
    </tbody>
</table>
<input type="submit" value="Submit" />
<%}%>                    

Controller:

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult SampleView(Guid id)
    {
        //Object to pass any input objects to the View Model Builder 
        BuilderIO viewModelBuilderInput = new BuilderIO();

        //The View Model Builder is a conglomerate of repositories and methods used to Construct a View Model out of Business Objects
        SampleViewModel viewModel = sampleViewModelBuilder.Build(viewModelBuilderInput);

        return View("SampleView", viewModel);
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult SampleView(SampleViewModel viewModel)
    {
        // The array of Guids successfully bound to the SelectedObjectIds property of the View Model!
        return View();
    }

Любой, кто знаком с философией View Model, обрадуется, это работает как Champ!

8
ответ дан 23 November 2019 в 03:02
поделиться
<input type = "checkbox" name = "checkbox1" /> <label> Check to say hi.</label>

Из контроллера:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(FormCollection fc)
    {

         var s = fc["checkbox1"];

         if (s == "on")
         {
             string x = "Hi";
         }
    }
5
ответ дан 23 November 2019 в 03:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: