在页面中显示列表asp.net核心mvc 3.0时出现问题

n7taea2i  于 2023-04-22  发布在  .NET
关注(0)|答案(1)|浏览(122)

我遇到了以下问题:我需要用户填写几个字段(他执行的工作,并指出这项工作的价格)由于有几个这样的工作,我使用列表,但我得到以下错误:ArgumentOutOfRangeException:索引超出范围。必须为非负数且小于集合的大小。(参数“index”)
当我转到“编辑”页面时,此错误就会出现。
下面是我的控制器代码:

User user = await _userManager.FindByNameAsync(User.Identity.Name);
        foreach(var up in _context.TutorProfesionAndCosts.ToList())
        {
            if (user.Id == up.UserId)
                user.ProfesionAndCosts.Add(up);
        }

用户模型

public List<TutorProfesionAndCost> ProfesionAndCosts { get; set; }

    public User()
    {
        ProfesionAndCosts = new List<TutorProfesionAndCost>();
    }

“工作”模式

public class TutorProfesionAndCost
{
    public int Id { get; set; }

    public string UserId { get; set; }
    public User User { get; set; }
    
    public string EducationalSubject { get; set; }

    public int Cost_One { get; set; } 
    public int Cost_Group { get; set; } 

    public string Currency { get; set; }
}

编辑页面

@{int i = 0;} 

<p>
    <div class="row">
        <div class="col">
            <label class="mb-0">Оберіть предмет який ви викладаєте:</label>
            <select asp-for="@Model.Tutor.ProfesionAndCosts[@i].EducationalSubject" required="required">
                @foreach (var profesion in Model.educational_Subject)
                {
                    <option value="@profesion.EducationalSubject">@profesion.EducationalSubject</option>
                }
            </select>
        </div>
        <div class="col">
            <label>Вкажіть вартість за 1 годину:</label>
            <p>
                <span>Індивідуальне заняття: <input class="money" type="text" asp-for="@Model.Tutor.ProfesionAndCosts[@i].Cost_One" /> </span>
                <span>Групове заняття: <input class="money" type="text" asp-for="@Model.Tutor.ProfesionAndCosts[@i].Cost_Group" /> </span>
                <select asp-for="@Model.Tutor.ProfesionAndCosts[@i].Currency">
                    @foreach (var cur in Model.currency)
                    {
                        <option value="@cur.CurrencyMoney">@cur.CurrencyMoney</option>
                    }
                </select>
            </p>
        </div>
    </div>

    <button onclick="addSubject()">New</button>
</p>

javascript新主题

<script>
function addSubject() {
    var index = document.querySelectorAll('.row').length;
    var html = `<div class="row">
        <div class="col">
            <label class="mb-0">Оберіть предмет який ви викладаєте:</label>
            <select asp-for="@@Model.Tutor.ProfesionAndCosts[${index}].EducationalSubject" required="required">
                @foreach (var profesion in Model.educational_Subject)
                {
                    <option value="@profesion.EducationalSubject">@profesion.EducationalSubject</option>
                }
            </select>
        </div>
        <div class="col">
            <label>Вкажіть вартість за 1 годину:</label>
            <p>
                <span>Індивідуальне заняття: <input class="money" type="text" asp-for="@@Model.Tutor.ProfesionAndCosts[${index}].Cost_One" /> </span>
                <span>Групове заняття: <input class="money" type="text" asp-for="@@Model.Tutor.ProfesionAndCosts[${index}].Cost_Group" /> </span>
                <select asp-for="@@Model.Tutor.ProfesionAndCosts[${index}].Currency">
                    @foreach(var cur in Model.currency)
                    {
                        <option value="@cur.CurrencyMoney">@cur.CurrencyMoney</option>
                    }
                </select>
            </p>
        </div>
    </div>`;
    $('#subjects').append(html);
    i = index + 1;
}
</script>
sr4lhrrt

sr4lhrrt1#

问题解决了。我用“name”代替“asp-for”传递值

<div id="ProfesionBlock">
        <div class="Profesion">
            <div class="row">
                <div class="col">
                    <p class="mb-0">Оберіть предмет який ви викладаєте:</p>

                    <input type="hidden" name="ProfesionAndCosts[0].UserId" value="@Model.Tutor.Id" />
                    <select name="ProfesionAndCosts[0].EducationalSubject" required="required">
                        @foreach (var profesion in Model.educational_Subject)
                        {
                            <option value="@profesion.EducationalSubject">@profesion.EducationalSubject</option>
                        }
                    </select>

                </div>
                <div class="col">
                    <p>Вкажіть вартість за 1 годину:</p>
                    <div>
                        <p>Індивідуальне заняття: <input class="money" type="text" name="ProfesionAndCosts[0].Cost_One" /> </p>
                        <p>Групове заняття: <input class="money" type="text" name="ProfesionAndCosts[0].Cost_Group" /> </p>
                        <label>Оберіть валюту: </label>
                        <select name="ProfesionAndCosts[0].Currency">
                            @foreach (var cur in Model.currency)
                            {
                                <option value="@cur.CurrencyMoney">@cur.CurrencyMoney</option>
                            }
                        </select>
                    </div>
                </div>
            </div>
        </div>

    </div>
    <p>
        <a class="addNewProfesion">Добавити нову професію</a>
    </p>

@section Scripts {
<script>
    $(function () {
        var i = 0;
        $('.addNewProfesion').click(function () {
            i++;
            var html2Add = `<div class="row">
        <div class="col">
            <p class="mb-0">Оберіть предмет який ви викладаєте:</p>
            <select name="ProfesionAndCosts[${i}].EducationalSubject" required="required">
                @foreach (var profesion in Model.educational_Subject)
                {
                    <option value="@profesion.EducationalSubject">@profesion.EducationalSubject</option>
                }
            </select>
        </div>
        <div class="col">
            <label>Вкажіть вартість за 1 годину:</label>
            <p>
                <p>Індивідуальне заняття: <input class="money" type="text"  name="ProfesionAndCosts[${i}].Cost_One" /> </p>
                <p>Групове заняття: <input class="money" type="text" name="ProfesionAndCosts[${i}].Cost_Group" /> </p>
                <select name="ProfesionAndCosts[${i}].Currency">
                    @foreach(var cur in Model.currency)
                    {
                        <option value="@cur.CurrencyMoney">@cur.CurrencyMoney</option>
                    }
                </select>
            </p>
        </div>
    </div>`;
            $('#ProfesionBlock').append(html2Add);
        })
    })
</script>

控制器

public async Task<IActionResult> AccountEditTutor( List<TutorProfesionAndCost> ProfesionAndCosts)
    {

        var userProf = await _context.TutorProfesionAndCosts
            .Where(up => up.UserId == user.Id)
            .ToListAsync();
        _context.TutorProfesionAndCosts.RemoveRange(userProf);

        foreach(var userProfAdd in ProfesionAndCosts)
        {
            var up = new TutorProfesionAndCost
            {
                UserId = user.Id,
                EducationalSubject = userProfAdd.EducationalSubject,
                Cost_One = userProfAdd.Cost_One,
                Cost_Group = userProfAdd.Cost_Group,
                Currency = userProfAdd.Currency
            };
            await _context.TutorProfesionAndCosts.AddAsync(up);
        }

  ///....
}

代码不是最好的,但它的工作

相关问题