对于列表中未在 POST 中检查的记录,Asp.Net MVC 5 复选框状态不会保持不变

布雷登

我有一个视图,它在带有复选框的表上显示记录,供用户选择和更新。但是,如果我在表中有 3 条记录 Data[0]、Data[1]、Data[2] 并且我只选中 Data[0] 的复选框并将其 POST 到控制器,那么当屏幕返回 Data [1] 复选框现在具有已提交 ( true)的 Data[0] 状态但是,数据库显示 Data[1] 的复选框值为 0(假)。我唯一的猜测是模型绑定,或者我需要保留复选框说明一些如何。

模型

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; }
}

获取方法

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);
    }
贾斯汀·赫尔格森

该值未更新,因为它正在被读取ModelState而不是模型读取查看一些相关问题以更好地了解此功能存在的原因。简短的版本是,POST如果存在需要更正的错误,通常您只会从 a 返回完全相同的页面通过阅读ModelState你给用户保留他们以前输入的好处。

解决此问题的两个选项:

  1. 在返回视图之前调用ModelState.Clear();您的HttpPost操作。我个人推荐这个,但它是一种选择。
  2. 如果ModelState有效,请遵循 Post -> Redirect -> Get 模式并调用RedirectToAction原始HttpGet方法。如果ModelState不是有效的,那么你在做什么,这样你就可以显示错误信息,并保持用户输入。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

对于大型嵌套复选框列表,ASP.NET MVC 表单 POST 非常慢

来自分类Dev

与 Angular 5 中的子组件内的 @Input 绑定时,复选框的选中状态不会更新

来自分类Dev

Iframe 未在 Asp .Net MVC5 中显示网站

来自分类Dev

如何在asp.net中的GridView中检查复选框列的状态

来自分类Dev

基于ASP.NET MVC中的复选框选择填充模型的嵌套列表对象

来自分类Dev

如何通过asp.net mvc中的自定义jQuery验证复选框列表

来自分类Dev

在 mvc 5 中检索复选框的值

来自分类Dev

在 mvc 5 中显示带有复选框的日历

来自分类Dev

Ajax.ActionLink POST在ASP.NET MVC 5中不起作用

来自分类Dev

复选框始终绑定为false,即使选中了asp.net mvc 5

来自分类Dev

复选框下拉列表不会在ASP MVC中停留

来自分类Dev

从ASP.NET MVC中的FormCollection中获取复选框的值

来自分类Dev

ASP.Net MVC 5中的Cookie

来自分类Dev

ASP .NET MVC 5中的异步任务

来自分类Dev

ASP.NET MVC 5中的ClaimsIdentity

来自分类Dev

在MVC 5视图的可滚动列表中显示大量复选框

来自分类Dev

如何从ASP.NET MVC的多个分页中获取所有选中的复选框?

来自分类Dev

在ASP.NET MVC 4中显示密码复选框

来自分类Dev

创建复选框矩阵以支持ASP.NET MVC中的回发

来自分类Dev

在ASP.NET MVC操作中获取复选框值

来自分类Dev

复选框列表值未绑定到 ASP.NET Core MVC 中的查看 GET 请求

来自分类Dev

我需要一个没有 EF 的 asp.net mvc 中带有复选框的下拉列表

来自分类Dev

带有POST形式的ASP .NET MVC 5 + Bootstrap模态

来自分类Dev

更新ASP .Net MVC中的记录

来自分类Dev

更新ASP .Net MVC中的记录

来自分类Dev

如何在Asp.net Core MVC(又名Asp.Net 5 RC1)中检查响应cookie?

来自分类Dev

如何在Asp.NET MVC中使用复选框创建MultiSelect下拉列表

来自分类Dev

Asp.Net MVC 5模型状态

来自分类Dev

ASP NET MVC 5会话状态

Related 相关文章

  1. 1

    对于大型嵌套复选框列表,ASP.NET MVC 表单 POST 非常慢

  2. 2

    与 Angular 5 中的子组件内的 @Input 绑定时,复选框的选中状态不会更新

  3. 3

    Iframe 未在 Asp .Net MVC5 中显示网站

  4. 4

    如何在asp.net中的GridView中检查复选框列的状态

  5. 5

    基于ASP.NET MVC中的复选框选择填充模型的嵌套列表对象

  6. 6

    如何通过asp.net mvc中的自定义jQuery验证复选框列表

  7. 7

    在 mvc 5 中检索复选框的值

  8. 8

    在 mvc 5 中显示带有复选框的日历

  9. 9

    Ajax.ActionLink POST在ASP.NET MVC 5中不起作用

  10. 10

    复选框始终绑定为false,即使选中了asp.net mvc 5

  11. 11

    复选框下拉列表不会在ASP MVC中停留

  12. 12

    从ASP.NET MVC中的FormCollection中获取复选框的值

  13. 13

    ASP.Net MVC 5中的Cookie

  14. 14

    ASP .NET MVC 5中的异步任务

  15. 15

    ASP.NET MVC 5中的ClaimsIdentity

  16. 16

    在MVC 5视图的可滚动列表中显示大量复选框

  17. 17

    如何从ASP.NET MVC的多个分页中获取所有选中的复选框?

  18. 18

    在ASP.NET MVC 4中显示密码复选框

  19. 19

    创建复选框矩阵以支持ASP.NET MVC中的回发

  20. 20

    在ASP.NET MVC操作中获取复选框值

  21. 21

    复选框列表值未绑定到 ASP.NET Core MVC 中的查看 GET 请求

  22. 22

    我需要一个没有 EF 的 asp.net mvc 中带有复选框的下拉列表

  23. 23

    带有POST形式的ASP .NET MVC 5 + Bootstrap模态

  24. 24

    更新ASP .Net MVC中的记录

  25. 25

    更新ASP .Net MVC中的记录

  26. 26

    如何在Asp.net Core MVC(又名Asp.Net 5 RC1)中检查响应cookie?

  27. 27

    如何在Asp.NET MVC中使用复选框创建MultiSelect下拉列表

  28. 28

    Asp.Net MVC 5模型状态

  29. 29

    ASP NET MVC 5会话状态

热门标签

归档