asp.net核心mvc模型与jquery中继器绑定

问题描述 投票:0回答:2

我在我的表单中使用jquery repeater来动态添加输入组的一部分来形成。我确实尝试但是无法将输入绑定到模型,我失明了。

这是我的模特。

public class SuggestionCreateEditViewModel
{
    public Guid[] DetectionId { get; set; }

    public SuggestionCreateEditRepeatedModel[] Repeated { get; set; }

}
public class SuggestionCreateEditRepeatedModel
{
    public Guid To { get; set; }

    public string Description { get; set; }

    public DateTime Deadline { get; set; }
}

表格,我删除了很多形式的部分,以简洁

<div class="col-lg-9 col-md-9 col-sm-12">
    <select asp-for="DetectionId" asp-items="ViewBag.AllDetections" class="m-bootstrap-select m_selectpicker toValidate" 
            multiple data-actions-box="true" data-width="100%"></select>
</div>
<div class="col-lg-9 col-md-9 col-sm-12 input-group date">
    <input name = "Repeated.Deadline" type="text" readonly class="form-control toValidate dtDueDate" />
</div>
<div class="col-lg-12 col-md-12 col-sm-12">
    <textarea name = "Repeated.Description" class="form-control toValidate txtSuggestion" type="text" >
    </textarea>
</div>

在将新的重复部分添加到表单之后并将其发布到服务器之前,如果我form.serailizeArray()它返回如下的集合(jquery表单中继器动态地形成名称我相信)

{name: "DetectionId", value: "afca1b82-0455-432e-c780-08d6ac38b012"}
{name: "[0][Repeated.To][]", value: "b1176b82-1c25-4d13-9283-df2b16735266"}
{name: "[0][Repeated.Deadline]", value: "04/04/2019"}
{name: "[0][Repeated.Description]", value: "<p>test 1</p>"}
{name: "[1][Repeated.To]", value: "188806d8-202a-4787-98a6-8dc060624d93"}
{name: "[1][Repeated.Deadline]", value: "05/04/2019"}
{name: "[1][Repeated.Description]", value: "<p>test 2</p>"}

和我的控制器

[HttpPost]
public IActionResult CreateSuggestion(SuggestionCreateEditViewModel model, IFormFile[] documents)
        {...

控制器无法获得Repeated绑定,只有DetectionId绑定。我应该如何塑造我的模型来获取数据?

c# asp.net-core asp.net-core-mvc model-binding
2个回答
1
投票

这是一个与jquery.repeater.js的工作演示,注意这行<div data-repeater-list="Repeated">将格式化字段像name="Repeated[0][Description]"

@model TestCore.Models.SuggestionCreateEditViewModel
@{
    ViewData["Title"] = "Contact";
}

<form class="repeater" asp-action="CreateSuggestion" method="post">
    <!--
        The value given to the data-repeater-list attribute will be used as the
        base of rewritten name attributes.  In this example, the first
        data-repeater-item's name attribute would become group-a[0][text-input],
        and the second data-repeater-item would become group-a[1][text-input]
    -->
    <div data-repeater-list="Repeated">
        <div data-repeater-item>
            <div class="col-lg-9 col-md-9 col-sm-12">
                <select asp-for="DetectionId" asp-items="ViewBag.AllDetections" class="m-bootstrap-select m_selectpicker toValidate"
                        multiple data-actions-box="true" data-width="100%"></select>
            </div>
            <div class="col-lg-12 col-md-12 col-sm-12">
                <textarea name="Description" class="form-control toValidate txtSuggestion" type="text">
                </textarea>
            </div>
        </div>
    </div>
    <input data-repeater-create type="button" value="Add" />
    <input type="submit" value="Submit"/>
</form>
@section Scripts{
    <!-- Import repeater js  -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.repeater/1.2.1/jquery.repeater.js"></script>
    <script>
        $(document).ready(function () {
            $('.repeater').repeater({
                // (Optional)
                // start with an empty list of repeaters. Set your first (and only)
                // "data-repeater-item" with style="display:none;" and pass the
                // following configuration flag
                initEmpty: true,

                // (Optional)
                // "show" is called just after an item is added.  The item is hidden
                // at this point.  If a show callback is not given the item will
                // have $(this).show() called on it.
                show: function () {
                    $(this).slideDown();
                },
                // (Optional)
                // "hide" is called when a user clicks on a data-repeater-delete
                // element.  The item is still visible.  "hide" is passed a function
                // as its first argument which will properly remove the item.
                // "hide" allows for a confirmation step, to send a delete request
                // to the server, etc.  If a hide callback is not given the item
                // will be deleted.
                hide: function (deleteElement) {
                    if (confirm('Are you sure you want to delete this element?')) {
                        $(this).slideUp(deleteElement);
                    }
                },

                // (Optional)
                // Removes the delete button from the first list item,
                // defaults to false.
                isFirstItemUndeletable: true
            })
        });    
    </script>
}

0
投票

从外观上看,控制器无法将转发器属性绑定回您的视图模型,因为发布内容的命名与视图模型中的命名不匹配(如Topher所述)。

DetectionId的名称是正确的,因为属性的名称匹配,而不是数组。

要解析数组,我们需要确保在表单中包含属性名称和索引,以便mvc模型绑定知道将结果绑定到的位置。

有了这个,你可以尝试将名称的格式更改为:重复[0] .To

这应该与您的控制器匹配并正确绑定。

有关绑定的更多信息,请参阅https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding

© www.soinside.com 2019 - 2024. All rights reserved.