将c#集合序列化为视图中的jquery数组以通过ajax方法传递给控制器

Posted

技术标签:

【中文标题】将c#集合序列化为视图中的jquery数组以通过ajax方法传递给控制器【英文标题】:Serializing c# collection to jquery array in the view to pass through the ajax method to controller 【发布时间】:2021-04-07 14:24:44 【问题描述】:

我有嵌套集合的视图模型。我想通过 ajax 发布该表单,但我无法正确序列化它。这是我的看法

    @model ARM.Presentation.ViewModels.SecurityFormProfileViewModel
    
    @
        ViewData["Title"] = "EditSecurityProfile";
        
    
    <hr />
    <div class="offset-1 row">
        <div class="col-md-12">
            <form asp-action="EditSecurityProfile" autocomplete="chrome-off" method="post" id="security- 
     profiles-form">
                <div class="form-row">
                    <div class="form-group">
                        <input asp-for="ProfileId" type="hidden" class="form-control" />
                    </div>
                    <div class="offset-2 col-md-2">
                        <h3>@Model.ProfileName</h3>
                    </div>
                    <div class="col-md-2">
                        <h5>Select Area to  Filter Items</h5>
                        <select id="areaid" class="form-control" asp-items="@Model.MainAreasList"> 
   </select>
                    </div>
    
                </div>
                <div class="form-row mt-2">
                    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                    <div class="col-md-6">
                        <div class="form-group">
                            <vc:security-form profile-id="@Model.ProfileId" area-id="null"></vc:security-form>
                        </div>
                    </div>
                </div>
                <div class="form-row">
                    <div class="form-group col-md-2">
                        <arm-submitbtn id="formprofilesubmit"></arm-submitbtn>
                        <arm-cancelbtn id="formprofilecancel"></arm-cancelbtn>
                    </div>
                </div>
            </form>
        </div>
    </div>
    <div class="offset-2 col-12">
        <vc:users-by-security-profile profile-id="@Model.ProfileId"></vc:users-by-security-profile>
    </div>
    <div>
        <a asp-action="Index">Back to List</a>
    </div>
    @section Scripts 
        @ await html.RenderPartialAsync("_ValidationScriptsPartial"); 
        <script src="~/js/Areas/Administration/Views/SecurityProfiles/SecurityProfiles.js"></script>
        <script src="~/js/Areas/Administration//Views/SecurityProfiles/SecurityProfilesService.js"> 
</script>
    

这是我在上述视图中调用的视图组件。

@model SecurityFormProfileViewModel

<div id="forms">
    <table class="table">
        <thead>
            <tr>
                <td></td>
                <td>Form Name</td>
                <td></td>
                <td></td>
                <td></td>
            </tr>

        </thead>
        <tbody>
            @for (int i = 0; i < Model.SecurityForms.Count; i++)
            
              <tr>
                <td>
                    <input type="hidden" asp-for="@Model.SecurityForms[i].FormId" />
                    <input type="hidden" asp-for="@Model.SecurityForms[i].AreaId" />
                </td>
                <td>                        
                    <label class="form-check-label">@Model.SecurityForms[i].FormName</label>
                </td>
                @foreach (var item in Model.SecurityForms[i].AccessLevels)
                 
                    <td>
                        <div class="form-check form-check-inline">
                            <input class="form-check-input" asp-for="@Model.SecurityForms[i].SelectedAccessLevelId" type="radio" id="inlineRaio1" 
                                   value="@item.AccessTypeId">
                            <label class="form-check-label">@item.AccessType</label>
                        </div>
                    </td>
                 

            </tr>
            
        </tbody>
    </table>
</div>

对于以上所有内容,我使用的是具有嵌套集合的视图模型。这是我想要使用 jquery 从视图中序列化的视图模型。

    public class SecurityFormProfileViewModel

    public int ProfileId  get; set; 
    public string ProfileName  get; set; 
    public List<SecurityFormViewModel> SecurityForms  get; set; 
    public IEnumerable<SelectListItem> MainAreasList  get; set; 

【问题讨论】:

我正在使用简单的序列化,但在视图模型中提交我的列表后控制器操作为空。静态 GetDataArray(idOfForm: string): JQuery.NameValuePair[] return $("#" + idOfForm).serializeArray(); 【参考方案1】:

首先,为什么要使用组件作为表单的一部分?通常,组件用于跨页面重用一些通用功能。他们的视图可以包含表单,但我认为它们不能成为父表单的一部分。如果你想在一个表单中重用一些 .cshtml 代码可能是一个局部视图是一个更好的方法?在这种情况下,列表SecurityForms 将为空,因为当将表单绑定到模型时,框架不知道来自组件视图的数据属于属性SecurityForms,即它无法从表单数据中绑定属性。解决这个问题的最简单方法是用局部视图替换组件并添加一个名为 SecurityForms 的前缀,这样在发布后 MVC 框架就会知道来自局部视图的数据属于属性 SecurityForms 更多信息这里getting the values from a nested complex object that is passed to a partial view

【讨论】:

我使用了 viewcomponent,因为它可以通过 ajax 从下拉列表中选择一些选项来加载。我认为 mvc 核心中的视图组件是部分替代,这就是我使用它的原因。当我通过回发提交表单时,它工作正常。它绑定了 SecurityForms。在 Html 方面,它的视图组件或单个表单无关紧要,因为在 HTML 中它显示为单个表单。问题在于 Jquery 序列化。

以上是关于将c#集合序列化为视图中的jquery数组以通过ajax方法传递给控制器的主要内容,如果未能解决你的问题,请参考以下文章

JSON.Net 将集合序列化为数组数组

将 JSON 数组反序列化为 List<T> C# 时出错

将位置坐标的 Mongo BSON 数组反序列化为自定义 C# 类

jquery 表单序列化

无法将 JSON 数组反序列化为 C# 对象 [关闭]

C#将不同类型的xml数组反序列化为多个数组