Состояния флажков Asp.Net MVC 5 не остаются неизменными для записей в списке, которые не проверяются на POST - PullRequest
0 голосов
/ 25 августа 2018

У меня есть представление, которое отображает записи в таблице с флажками для выбора и обновления пользователем. Однако, если у меня есть 3 записи в таблице, Data [0], Data [1], Data [2], и я выбираю только флажок для Data [0] и POST его к контроллеру, то когда на экран возвращается Data Флажок [1] ​​теперь имеет состояние отправленных данных [0] (true). Однако база данных показывает значение флажка 0 (false) для данных [1]. Мое единственное предположение - что-то с привязкой модели, или мне нужно было бы сохранить состояния флажка, как-то.

Модель

public class DrinkingWaterModel 
{
    //contains all properties of the FPDrinkingWater Entity 
    public List<FPDrinkingWater> Data { get; set; } 

    public AlertModel SuccessAlert { get; set; }

    public AlertModel FailureAlert { get; set; }
}

Метод GET

public async Task<ActionResult> UnverifiedDrinkingWaterLog(AlertModel 
successAlert, AlertModel failureAlert)
    {
        //get unverified data from the db
        var data = (from s in await Manager.Store.GetAllAsync<FPDrinkingWater>()
                   where s.Verified.Equals(false)
                   select s).ToList();

        //fill the model
        DrinkingWaterModel model = new DrinkingWaterModel
        {
            SuccessAlert = successAlert,
            FailureAlert = failureAlert,
            Data = data
        };

        return PartialView("_UnverifiedFPDrinkingWaterTable", model);
    }

Вид

@model MyApplication.Areas.FP.Models.DrinkingWaterModel
@{
Layout = null;
}
<div>
    @Html.AntiForgeryToken()
    <table id="UnverifiedDrinkingWaterTable" class="table table-hover">
        <thead>
            <tr>
                <th>@Html.LabelFor(m => m.Data.FirstOrDefault().SID)</th>
                <th>@Html.LabelFor(m => m.Data.FirstOrDefault().Location)</th>
                <th>@Html.LabelFor(m => m.Data.FirstOrDefault().Replicate)</th>
                <th>@Html.LabelFor(m => m.Data.FirstOrDefault().CollectionDate)</th>
                <th>@Html.LabelFor(m => m.Data.FirstOrDefault().CollectionTime)</th>
                <th>@Html.LabelFor(m => m.Data.FirstOrDefault().Collectors)</th>
                <th>@Html.LabelFor(m => m.Data.FirstOrDefault().Clorinated)</th>
                <th>@Html.LabelFor(m => m.Data.FirstOrDefault().Comments)</th>
                <th>@Html.LabelFor(m => m.Data.FirstOrDefault().Verified)</th>
            </tr>
        </thead>

        <tbody>
            @for (int i = 0; i < Model.Data.Count(); i++)
            {
                <tr>
                    @Html.HiddenFor(m => m.Data[i].Id)
                    @Html.HiddenFor(m => m.Data[i].SID)
                    <td>@Html.DisplayFor(m => m.Data[i].SID)</td>
                    @Html.HiddenFor(m => m.Data[i].Location)
                    <td>@Html.DisplayFor(m => m.Data[i].Location)</td>
                    @Html.HiddenFor(m => m.Data[i].Replicate)
                    <td>@Html.DisplayFor(m => m.Data[i].Replicate)</td>
                    @Html.HiddenFor(m => m.Data[i].CollectionDate)
                    <td>@Html.DisplayFor(m => m.Data[i].CollectionDate)</td>
                    @Html.HiddenFor(m => m.Data[i].CollectionTime)
                    <td>@Html.DisplayFor(m => m.Data[i].CollectionTime)</td>
                    @Html.HiddenFor(m => m.Data[i].Collectors)
                    <td>@Html.DisplayFor(m => m.Data[i].Collectors)</td>
                    @Html.HiddenFor(m => m.Data[i].Clorinated)
                    <td>@Html.DisplayFor(m => m.Data[i].Clorinated)</td>
                    @Html.HiddenFor(m => m.Data[i].Comments)
                    <td>@Html.DisplayFor(m => m.Data[i].Comments)</td>
                    <td>@Html.EditorFor(v => v.Data[i].Verified) </td>
                </tr>
            }

            @if (Model.Data.Count() == 0)
            {
                <tr>
                    <td colspan="@Html.ColumnCount(9)"><em>No Drinking Water data to verify.</em></td>
                </tr>
            }

        </tbody>
    </table>

@if (verify)
{
<button type="submit" class="btn btn-primary" data-loading-text="Verifying...">Verify</button>
}
</div>
<script>
$(document).ready(function () {
        makeDataTable('UnverifiedDrinkingWaterTable')
    });
    $('#RefreshDrinkingWater').click();



</script>

Метод POST

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> VerifyDrinkingWater([System.Web.Http.FromBody] DrinkingWaterModel model)
    {
        var successAlert = new AlertModel();
        var failureAlert = new AlertModel();

        if (ModelState.IsValid)
        {
            List<string> successes = new List<string>();
            List<string> failures = new List<string>();


            foreach (var verifiable in model.Data)
            {
                if (verifiable.Verified != false)
                {
                    verifiable.Verified = true;
                    verifiable.VerifiedDate = DateTime.Now;
                    verifiable.VerifiedBy = User.Identity.Name;  
                    var result = await Manager.VerifyAsync(verifiable);
                }
             }
        }
        else
        {
            InvalidState(failureAlert);
        }
        //return the GET method to update and refresh the table
        return await UnverifiedDrinkingWaterLog(successAlert, failureAlert);
    }

1 Ответ

0 голосов
/ 25 августа 2018

Значение не обновляется, потому что оно читается ModelState, а не моделью. Ознакомьтесь с некоторыми связанными вопросами , чтобы получить более полное представление о том, почему эта функция существует.Короткая версия такова, что обычно вы возвращаете ту же самую страницу с POST только в случае ошибки, которую необходимо исправить.Читая из ModelState, вы даете пользователю возможность сохранить свой предыдущий ввод.

Два варианта решения этой проблемы:

  1. Вызов ModelState.Clear(); в вашем HttpPostдействие, прежде чем вернуть вид.Лично я бы не рекомендовал бы это, но это вариант.
  2. Если ModelState действителен, следуйте Post -> Redirect -> Get pattern и позвоните по номеру RedirectToActionоригинальный метод HttpGet.Если ModelState является не действительным, то сделайте то, что вы делаете, чтобы вы могли показать сообщение об ошибке и сохранить ввод пользователя.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...