Как получить входное значение флажка, связанное со свойством списка сложных объектов в MVC? - PullRequest
0 голосов
/ 19 февраля 2019

Я искал это и нашел несколько решений, но ни одно из них не работает для меня.

Я использую Razor для создания MVC-представления.Модель, которую я передаю, определена следующим образом:

    public class ActiveProxiesDTO
{
    /// <summary> error message returned by the transaction </summary>
    public string ErrorMsg { get; set; }
    /// <summary> List of proxies returned by the transaction </summary>
    public List<ActiveProxiesDetailDTO> ActiveProxies { get; set; }
}

/// <summary> A single proxy </summary>
public class ActiveProxiesDetailDTO
{
    /// <summary> Proxie's PERSON id </summary>
    public string ProxyId { get; set; }
    /// <summary> Proxie's First Name </summary>
    public string FirstName { get; set; }
    /// <summary> Proxie's Last Name </summary>
    public string LastName { get; set; }
    /// <summary> Proxie's email address </summary>
    public string EmailAddress { get; set; }
    /// <summary> Does user want to reset this proxy's password?</summary>
    public bool Reset { get; set; }
}

В методе действия, который вызывает представление, я установил для "Сброс" bool значение false для всех элементов в списке.

Мое представление определяется следующим образом:

@model Ellucian.Colleague.Dtos.Base.M32.ActiveProxiesDTO

 @using (Html.BeginForm("PostResetProxy", "Core", FormMethod.Post, new { Area = "M32" }))
{
    @Html.AntiForgeryToken()

    <div class="dataentry">
       Proxies:
       <br />
       <table>
           <tr>
               <th>Reset?</th> <th>Name</th> <th>Email Address(to send new password)</th>
           </tr>

           @for (int i = 0; i < Model.ActiveProxies.Count; i++)
           {
               <tr>
                   <td>
                       <!-- make sure all data bind to the model being passed to the next controller action method -->
                       <input type="hidden" name="ActiveProxies[@i].ProxyId"      value="@Model.ActiveProxies[i].ProxyId" />
                       <input type="hidden" name="ActiveProxies[@i].FirstName"    value="@Model.ActiveProxies[i].FirstName" />
                       <input type="hidden" name="ActiveProxies[@i].LastName"     value="@Model.ActiveProxies[i].LastName" />
                       <!--  checkboxes require both a hidden and non-hidden input element -->
                       <input type="hidden" name="ActiveProxies[@i].Reset" value="@Model.ActiveProxies[i].Reset" />
                       <input type="checkbox" name="ActiveProxies[@i].Reset" value="true" />
                   </td>
                   <td>
                       @{ var displayName = Model.ActiveProxies[i].FirstName + " " + Model.ActiveProxies[i].LastName; }
                       @displayName
                   </td>
                   <td>
                       <input type="text" name="ActiveProxies[@i].EmailAddress" value="@Model.ActiveProxies[i].EmailAddress" />
                   </td>
               </tr>
           }
       </table>
       <br />
       <input type="submit" />

 ...

на данный момент метод действия, обрабатывающий POST, просто:

        [HttpPost]
    public ActionResult PostResetProxy( ActiveProxiesDTO formData )
    {
        return Redirect(Url.Action("Index", "Home", new { Area = "" }));
    }

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

Я пытался использовать Html.CheckBox и Html.CheckBoxFor различными способами, как описано в другом месте вэтот форум, но безуспешно.Я попытался использовать строку вместо bool для значения флажка, но это также не удалось.У меня нет идей.Кто-нибудь видит, что я делаю не так?- TIA Gus

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Я только что нашел лучшее решение.Первоначально я безуспешно пытался использовать помощники @ Html.CheckBox и @ Html.CheckBoxFor и поэтому отказался от использования помощников для ввода своих флажков.

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

Я заменил свои исходные строки

                       <!--  checkboxes require both a hidden and non-hidden input element -->
                   <input type="hidden" name="ActiveProxies[@i].Reset" value="@Model.ActiveProxies[i].Reset" />
                   <input type="checkbox" name="ActiveProxies[@i].Reset" value="true" />

на одну строку

           @Html.EditorFor(m => Model.ActiveProxies[i].Reset)

и ..К моему удивлению, это сработало, что позволило мне убрать код kluge из моего метода POST.

0 голосов
/ 20 февраля 2019

Я нашел решение, которое работает для меня (оно не включает JavaScript (я еще не владею им).

По возвращении к методу, обрабатывающему запрос Post, я проверил значения в Request.Сформируйте ["ActiveProxies [i] .Reset"] и заметите, что значение всегда было ", true" (странно, что у него есть "," префикс! Ошибка?) Для каждой строки таблицы, где у меня было "Сбросить"?проверил, и пустую строку, где бы у меня не было галочки.

Так что я обошел проблему, добавив логику в начало моего действия POST, которое исправляет значения в моем аргументе formData. (Незавершенный) метод Post сейчасгласит:

    [HttpPost]
    public ActionResult PostResetProxy( ActiveProxiesDTO formData )
    {
        for ( int i=0 ; i < formData.ActiveProxies.Count ; i++ )
        {
            string x = Request.Form[ "ActiveProxies["+i+"].Reset"];
            formData.ActiveProxies[i].Reset = x.Contains("true") ? true : false;
        }

        // for the time being, just return to the home page
        return Redirect(Url.Action("Index", "Home", new { Area = "" }));
    }
...