На главную
ПРАВИЛА 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,0732 ]   [ 15 queries used ]   [ Generated: 19.09.19, 19:43 GMT ]