c# - 在 asp.net core mvc 中创建实体列表

标签 c# asp.net-core-mvc

我想在asp.net core mvc中创建一个实体。该实体代表一项运动锻炼,它有一个运动集的子集合:

public class Workout
{
    public DateTime Date { get; set; }        
    public string Name { get; set; }
    public string Description { get; set; }

   public virtual ICollection<Set> Sets { get; set; }
}

public class Set
{
    public int Id { get; set; }
    public int ExerciseId { get; set; }
    public int WorkoutId { get; set; }
    public decimal Weight { get; set; }
    public int Reps { get; set; }

    public virtual Exercise Exercise { get; set;  }
    public virtual Workout Workout { get; set; }
}

表格如下所示:

enter image description here

“添加集”按钮使用 JavaScript 将一组“集”相关字段添加到表单中,因此可以有任意数量的“集”相关字段。

这是我包含表单的 View 的现有代码:

    @model Weightlifting.Models.Workout

@{
    ViewData["Title"] = "Add Workout";
}

<h2>Add Workout</h2>

<form asp-action="Create">
    <div class="form-horizontal">
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="Date" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="Date" class="form-control" />
                <span asp-validation-for="Date" class="text-danger" />
            </div>
        </div>
        <div class="form-group">
            <label asp-for="Name" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="Name" class="form-control" />
                <span asp-validation-for="Name" class="text-danger" />
            </div>
        </div>
        <div class="form-group">
            <label asp-for="Description" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="Description" class="form-control" />
                <span asp-validation-for="Description" class="text-danger" />
            </div>
        </div>        
        <div class="form-group">
            <fieldset class="form-add-set">
                <label for="sets" class="col-md-2 control-label">Sets</label>
                <div class="col-md-10">
                    <div class="add-sets">
                        <div class="form-inline add-set">
                            <div class="form-group">
                                <label class="control-label">Exercise</label>
                                <select class="form-control" asp-items="ViewBag.Exercises"></select>                               
                            </div>
                            <div class="form-group">                                                               
                                    <label asp-for="Sets.First().Reps" class="control-label"></label>
                                    <input asp-for="Sets.First().Reps" placeholder="Reps" class="form-control" />
                                    <span asp-validation-for="Sets.First().Reps" class="text-danger" />                               
                            </div>
                            <div class="form-group">
                                <label asp-for="Sets.First().Weight" class="control-label"></label>
                                    <input asp-for="Sets.First().Weight" class="form-control" />
                                    <span asp-validation-for="Sets.First().Weight" class="text-danger" />
                            </div>
                            <div class="form-group">
                                <button class="btn btn-remove-set" data-toggle="tooltip" title="Remove Set"><span class="glyphicon glyphicon-minus"></span></button>
                            </div>
                        </div>                    
                    </div>
                    <button class="btn btn-add-set">Add Set</button>
                </div>
            </fieldset>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-primary" />
            </div>
        </div>
    </div>
</form>

<div>
    <a asp-action="Index"><span class="glyphicon glyphicon-arrow-left"></span> Back</a>
</div>

@section Scripts {
<script type="text/javascript">
    $(document).ready(function () {     
        var wrapper = $('.add-sets');

        $(".btn-add-set").click(function(e) {
            e.preventDefault();
            $('.add-set:first-child').clone(true).appendTo(wrapper);

            $('.add-set .btn-remove-set').show();
        });

        $('.btn-remove-set').click(function (e) {
            e.preventDefault();
            $(this).parents('.add-set').remove();

            removeButton();
        });

        function removeButton() {
            if ($('.add-set').length == 1) {
                $('.add-set .btn-remove-set').hide();
            }
        }
    });
</script>
}

这是 View 发布到的 Controller 操作:

public async Task<IActionResult> Create([Bind("Id,Date,Description,Name")] Workout workout)
{
    // do stuff
}

我的问题是:如何对表单进行编码,以便将“Sets”发布到锻炼模型中的 Set 集合?

最佳答案

从操作方法中删除 [Bind("Id,Date,Description,Name")]

public async Task<IActionResult> Create(Workout workout)
{
    // do stuff
}

然后对您的 Set 属性应用索引,如下所示。

<div class="form-inline add-set">
                                <div class="form-group">
                                    <label class="control-label">Exercise</label>
                                    <select name="Sets[0].ExerciseId" class="form-control"><option value="1">Push Up</option>
    <option value="1">Set Up</option>
    </select>

<div class="add-sets">
    <div class="form-inline add-set">
        <div class="form-group">
            <label class="control-label">Exercise</label>
            <select name="Sets[0].ExerciseId" class="form-control" asp-items="ViewBag.Exercises"></select>
        </div>
        <div class="form-group">
            <label asp-for="Sets.First().Reps" class="control-label"></label>
            <input asp-for="Sets.First().Reps" name="Sets[0].Reps" placeholder="Reps" class="form-control" />
            <span asp-validation-for="Sets.First().Reps" class="text-danger" />
        </div>
        <div class="form-group">
            <label asp-for="Sets.First().Weight" class="control-label"></label>
            <input asp-for="Sets.First().Weight" name="Workout.Sets[0].Weight" class="form-control" />
            <span asp-validation-for="Sets.First().Weight" class="text-danger" />
        </div>
        <div class="form-group">
            <button class="btn btn-remove-set" data-toggle="tooltip" title="Remove Set"><span class="glyphicon glyphicon-minus"></span></button>
        </div>
    </div>
</div>

动态添加新行时,请确保索引号必须是连续的,从 0 开始并且不跳过任何迭代。

关于c# - 在 asp.net core mvc 中创建实体列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41465103/

相关文章:

c# - 使用 Selenium WebDriver 从 IWebElement 获取所有属性

c# - 在 C# 中正确编码 C++ 结构

c# - 应用程序停用时如何关闭 BackgroundWorker 线程?

asp.net-core-mvc - 使用 Entity Framework Core 缓存表

c# - 对象引用在多层异步等待操作中丢失

c# - 虚拟路径**映射到另一个应用程序,这是不允许的

c# - 从 React 前端使用 API POST 到 Entity Framework Controller 时始终出现 null 异常

c# - 更改默认操作对 ASP.NET Core 2 不起作用

c# - 错误 'IConfigurationProvider' 声称它在 'Microsoft.Framework.Configuration.Abstractions' 中定义

asp.net-mvc - 我必须附加到什么进程才能使用 IIS Express 配置文件在 MVC 6 Web 应用程序中进行调试?