发布传递的空模型值以及如何正确删除或修复它?

时间:2018-10-15 07:26:37

标签: c# asp.net-core .net-core asp.net-core-mvc

提交按钮时的示例输出,

enter image description here

enter image description here

我不知道为什么我具有空值,这是我的示例表格。细节来自局部视图

enter image description here

部分查看代码

        @model SimplyAccounting.Models.TransactionViewModels.JournalDetailsViewModel
        @using (Html.BeginCollectionItem("JournalDetailsViewModel"))
        {
            <tr class="checkDetails" id="@Model.Guid">
                <td>

        //code here
    <td>
<tr class="DocumentDetails" id="@Model.Guid">
                <div class="btn-group btn-group-toggle">
                    <button type="button" class="btn btn-sm btn-info btnModal" guid="@Model.Guid"><i class="far fa-file"></i></button>
                    <button type="button" class="btn btn-sm btn-danger" id="delete" name="delete" value="delete" onclick="javascript: deleteBook(document.getElementById('@Model.Guid'))"><i class="far fa-trash-alt"></i></button>
                </div>
            </td>
</tr>
        }

我注意到,如果添加新行并将其删除,则将显示null值。如果我再添加2行并删除2行,则还会显示2个空值

添加行中的代码

function GetRow() {
        var form = $('form');
        var urlStr = '@Url.Action("CreateJournalDetails", "Journals")';
        $.ajax({
            url: urlStr,
            success: function (data) {
                $('#journalRow').append('<tr>' + data + '</tr>');
                $('tbody#journalRow>tr.checkDetails').appendTo('#checkRow');
                form.data('validator', null);
                $.validator.unobtrusive.parse(form);
            }
        });
    }

删除行的代码:

function deleteBook(bookDiv) {
        var id = $(bookDiv).attr("id");
        var cnt = document.getElementsByClassName("DocumentDetails").length;
        if (cnt > 2) {
            bookDiv.remove();
            document.getElementById(id).remove();
        }
    }

控制器:

public IActionResult CreateJournalDetails(JournalDetailsViewModel vmodel)
    {
        vmodel = new JournalDetailsViewModel();
        vmodel.Gla_List = GlaList();
        vmodel.Function_List = FunctionList();
        vmodel.Expense_List = ExpenseList();
        vmodel.Bank_List = BankList();
        vmodel.Location_List = LocationList();
        vmodel.Branch_List = BranchList();
        vmodel.Asset_List = AssetList();
        vmodel.Item_List = ItemList();

        return PartialView("_JournalDetails", vmodel);
    }

1 个答案:

答案 0 :(得分:2)

现在,当您在服务器端时,只需将视图模型中的空项目删除到新列表中,然后将新列表添加到上下文中即可。

您应始终假设帖子中的数据可能是错误的/被篡改的,并且应尽可能验证帖子中获取的数据。因此,即使您在前端对其进行了修复,也应确保获取的数据有效。

也就是说,这应该可以解决您的问题。

var newViewModel = new List<JournalDetails>();
foreach (var item in newViewModel.JournalDetailsViewModel)
{
    if (item != null)
    {
        ...
        newViewModel.Add(item);
    }
}

var dtails = _mapper.Map<List<JournalDetails>>(newViewModel.JournalDetailsViewModel);
_context.AddRange(newViewModel);

...