Почему список не передается в IActionResult

#c# #asp.net-mvc #asp.net-core #razor-pages

#c# #asp.net-mvc #asp.net-core #razor-страницы

Вопрос:

Почему список newsletterSubComponents не передается IActionResult . Кто-нибудь может помочь, пожалуйста. Я знаю, что есть один вариант BindProperty , но я не могу его использовать, так как этот список исходит из частичного представления. Я могу изменить только список, который находится внутри модели, которая передается в partial_view.

Список в модели

 List<NewsletterSubComponents> newsletterSubComponents = {get; set;}
 

Частичный просмотр

   @{

    Model.newsletterSubComponents.Add(new Models.NewsletterSubComponents() { NewPlantArticleId = 0 });
    Model.newsletterSubComponents.Add(new Models.NewsletterSubComponents() { NewPlantArticleId = 2 });

}

@for (var i = 0; i < Model.newsletterSubComponents.Count;   i)
{
    <select class="form-control Shoplist News-plant-select_1 mt-2" data-search="true" asp-for="@Model.newsletterSubComponents[i].NewPlantArticleId">
        <option value="0">Bitte auswählen</option>
    </select>
}
 

Контроллер

  public IActionResult OnPostUpdateComponent(NewsletterComponents component, int? newsId, int? shortArticleId,
        List<NewsletterSubComponents> newsletterSubComponents, int? newPlant1, int? newPlant2, int? newPlant3)
    {
        var dbComponent = _context.NewsletterComponents.Find(component.NewsletterComponentId);
        if (dbComponent == null)
        {
            return RedirectToPage("./Index");
        }
        dbComponent.NewsId = newsId;
        dbComponent.ShortArticleId = shortArticleId;
        dbComponent.newsletterSubComponents = component.newsletterSubComponents;
        dbComponent.NewsletterMoreLink = component.NewsletterMoreLink;
        dbComponent.CustomLinkText = component.CustomLinkText;
        dbComponent.NewsleterComponentText = component.NewsleterComponentText;
        dbComponent.NewsletterComponentHeadline = component.NewsletterComponentHeadline;
        dbComponent.EditedBy = User.Identity.Name;
        dbComponent.EditedDate = DateTime.Now;
        _context.Update(dbComponent);
        _context.SaveChanges();
        UpdateNewsletterHtml((int)dbComponent.BelongsToNewsletterId);

        return RedirectToPage(new { id = dbComponent.BelongsToNewsletterId });
    }
 

newsletterSubComponents параметр пуст при отладке!

Комментарии:

1. Я не понимаю вашу проблему, в чем проблема? в контроллере newsletterSubComponents имеет значение null?

2. @nalnpir да , точно , значение newsletterSubComponents равно нулю

Ответ №1:

Я обновил метод для передачи списка через javascript, вы можете обратиться к следующему примеру.

В частичном представлении я вводю pagemodel и смимулирую некоторые данные.

 @model projectname.Pages.IndexModel
@{

Model.newsletterSubComponents.Add(new Models.NewsletterSubComponents() { NewPlantArticleId = 0 });
Model.newsletterSubComponents.Add(new Models.NewsletterSubComponents() { NewPlantArticleId = 2 });

}

<form>
    @for (var i = 0; i < Model.newsletterSubComponents.Count;   i)
    {
         <select class="form-control Shoplist News-plant-select_1 mt-2" data-search="true" onchange="changeVal(event)" asp-for="@Model.newsletterSubComponents[i].NewPlantArticleId">
            <option value="0">Bitte auswählen</option>
        </select>
    }
    @Html.AntiForgeryToken()
    <button type="button" onclick="send()">btn</button>
</form>
 

Используйте javascript для передачи этого списка.

 @section Scripts{
<script>
    var SubComponents = [];
    var s = '@Model.newsletterSubComponents.Count()'
    for (var i = 0; i < s; i  ) {
        SubComponents[i] = { "NewPlantArticleId": $("#newsletterSubComponents_"   i   "__NewPlantArticleId").val() }
    }
     function changeVal(e) {
        let nid = e.target.id
        let k = nid.replace(/[^0-9]/ig,"")
        SubComponents[k]={ "NewPlantArticleId": $("#newsletterSubComponents_"   k   "__NewPlantArticleId").val() }
    }
    function send() {
        $.ajax({
            url: '/?handler=UpdateComponent',
            method: 'post',
            headers: {
                RequestVerificationToken: $('input:hidden[name="__RequestVerificationToken"]').val()
            },
            data: {
                newsletterSubComponents: SubComponents
            },
            success: function (data) {
                console.log(data)
            },
            error: function () {
                console.log('ee')
            }
        })
    }
</script>
}
 

Затем обратитесь к серверной части.

введите описание изображения здесь

Комментарии:

1. большое вам спасибо за ваше время, но одно но: список заполняется с помощью javascript, а не asp-items=»components». Могу ли я передать список только контроллеру?

2. Да, но я хочу знать, как вы отправляете список на контроллер? Потому что на него может повлиять сопоставление модели.

3. хорошо, я рассмотрю это, возможно, мой подход не очень хорош. но я пытался передать список, точно так же, как мы передаем string или int контроллеру.

4. Вы используете ajax?

5. @AmirDora. можете ли вы принять это как ответ? Или у вас есть какие-либо другие проблемы? пожалуйста, дайте мне знать.