На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: maxim84_, juice
  
> Razor Page Partial, ASP .NET Core 2.2
Всем привет.

Может кто то пояснить как работают частичные представления на уровне Razor классов наследуемых от PageModel ?
Вот допустим есть у меня частичное представление _CatIdInfoPartial:
ExpandedWrap disabled
    @model CatWebApi.Models.CatId
     
    @using Microsoft.AspNetCore.Mvc.Localization
    @inject IViewLocalizer Localizer
    @{
        Layout = null;
    }
     
     
    <div id="@Model.Id" class="tabcontent bg-light box-shadow container border">
        <div class="container box-shadow" style="max-height:92%;min-height:30%; overflow:auto">
            <table class="table table-striped" style="border-collapse:separate">
                <thead class="thead-dark">
                    <tr style="color:antiquewhite">
                        <th>Cat Id</th>
                        <th>Cat Family</th>
                        <th>Cat Model</th>
                        <th>Cat Location</th>
                    </tr>
                </thead>
                <tbody>
                    @for (int idx = 0; idx < 2; ++idx)
                    {
                        <tr>
                            <td>@Model.Id</td>
                            <td>@Model.Family</td>
                            <td>@Model.Model</td>
                            <td>@Model.Location</td>
                        </tr>
                    }
                </tbody>
     
            </table>
        </div>
    </div>


Дальше есть у меня класс обработчик, вызывается он через ajax запрос:
ExpandedWrap disabled
        [ValidateAntiForgeryToken]
        public class IndexModel : PageModel
        {
            //! Вот этот обработчик вызывается когда я нажимаю на кнопку определенную на веб форме.
            public PartialViewResult OnPostSelectCat(string catId)
            {
                CatId cat = null;
                foreach (var item in Cats)
                {
                    if (item.Id == catId)
                    {
                        cat = item;
                        break;
                    }
                }
                return Partial("_CatIdInfoPartial", cat); //! Вот примерно в этом месте летит исключение
            }
       }

И почему то при вызове этого обработчика летит исключение типа:
ExpandedWrap disabled
    fail: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1]
          An unhandled exception has occurred while executing the request.
    System.InvalidOperationException: The model item passed into the ViewDataDictionary is of type 'CatWebApi.Models.CatId', but this ViewDataDictionary instance requires a model item of type 'CatWebApi.Pages.IndexModel'.
       at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary.EnsureCompatible(Object value)
       at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary.SetModel(Object value)
       at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary.set_Model(Object value)
       at Microsoft.AspNetCore.Mvc.RazorPages.PageModel.Partial(String viewName, Object model)

Ничего не понимаю. Если вызывать в самом html файле что то типа @{await Html.RenderPartialAsync("_CatIdInfoPartial", cat);} то все работает, а если через метод класса, то летит вот такое исключение. Притом что если передать ему то, что он просит в качестве модели, то будет лететь ровно такая же ошибка, но будет он просить уже то, что ему реально нужно передать.

Может быть есть кто в курсе как с этим работать?
Сообщение отредактировано: Wound -
Кажется я понял как это делать.
Нашел решение вот тут: http://qaru.site/questions/7163065/how-to-...1432%2349183026
Для моего случая метод-обработчик, который возвращает частичное представление будет выглядеть вот так:
ExpandedWrap disabled
            public IActionResult OnGetCatIdInfo(string catId)
            {
                var Cat = new CatId()
                {
                    Id = catId,
                    Family = "CatFamily Selected",
                    Model = "CatModel Selected",
                    Location = "CatLocation Selected"
                };
     
                var myViewData = new Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary(new Microsoft.AspNetCore.Mvc.ModelBinding.EmptyModelMetadataProvider(), new Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary()) { { "_CatIdInfoPartial", Cat } };
                myViewData.Model = Cat;
     
                PartialViewResult result = new PartialViewResult()
                {
                    ViewName = "_CatIdInfoPartial",
                    ViewData = myViewData,
                };
     
                return result;
            }

Результат сразу можно передать в какой нибудь div как html.
Что то типа:
ExpandedWrap disabled
     $.ajax({
            url: '/Index?handler=CatIdInfo&catId=' + catId,
            type: 'GET',
            contentType: "application/json",
            success: function (cat) {
                document.getElementById('catInfoContent').innerHTML = cat;
            },
    ...
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,0876 ]   [ 20 queries used ]   [ Generated: 16.07.19, 20:33 GMT ]