Отображать все сведения о элементе списка при нажатии на конкретный элемент списка с использованием бритвенных страниц и компонента просмотра

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

Я долгое время пытался отобразить детали элемента списка, когда мы щелкаем элемент списка, но я могу отобразить только статический контакт с помощью этого кода:

    <div id="contactdetail">
        @await Component.InvokeAsync("ContactDetails", new { id = 1})
    </div>

В MVC мы можем вызвать представление с помощью JQuery, подобного этому:

$("#listitem").click(function () {
        $("#contactdetail").load('/ContactDetails/Invoke')
    })

но здесь используются только страницы razor и структура Entity Core, как я предполагаю сделать это, и в этом нам также нужно передать Id, поскольку он будет отвечать за получение соответствующего контакта, а затем за загрузку представления.

Мой ContactDetailViewComponent.cs:

public class ContactDetailsViewComponent : ViewComponent
    {
        private readonly IContactDetails contactDetails;

        public Contact Contact { get; private set; }

        public ContactDetailsViewComponent(IContactDetails contactDetail)
        {
            this.contactDetails = contactDetail;
        }

        public IViewComponentResult Invoke(int id)
        {
            Console.WriteLine("Called {0}", id);
            var contact = contactDetails.GetContact(id);
            return View("Default", contact);
        }
    }
}

Index.chtml, содержащий как список, так и детали:

<!-- Contacts Heading -->
<h4 class="p-3 px-4 font-weight-bolder">Contacts</h4>

<!-- Parent container for the the below list and displaying addresses-->
<div class="container-fluid py-3 px-4  h-100">
    <div class="row">
        <!-- Column which contains the list of all the contacts present currently -->
        <div class="col-md-4 ">
            <ul class="list-group contact-list-cards">
                @foreach (var contact in Model.Contacts)
                {
                    <li class="list-group-item py-0 px-3 position-relative"
                       >
                        <a class="stretched-link contact-name  curson_pointer text-decoration-none name-heading m-0"
                           href="#"
                           id="listItem"
                           onclick="loadDetails(@contact.Id)" >@contact.Name </a>
                        <p class=" text-secondary m-0 mx-2 ">@contact.Email</p>
                        <p class=" text-secondary m-0 mx-2 mb-2">+91 @contact.MobileNumber</p>
                    </li>
                }
            </ul>
        </div>

        <!-- Column which will display the informaation when clicked on the specific list item of contact -->
        <div id="contactdetail">
            @await Component.InvokeAsync("ContactDetails", new { id = currentId })
        </div>

    </div>
</div>

Используемый метод частичного просмотра:

Метод сведений о загрузке:

function loadDetails(id)
    {
            console.log(id);
            $("#contactdetail").load("/Contacts/Index/OnPostContactPartial?id="+id,
            function (res, status, xhr) {
            if (status == "error") {
             console.log(status);
            alert("An error occurred while loading the results.");
            }
            });
            console.log($("#contactdetail"));
     }

Файл Index.chtml, в котором я называю эту загрузку Detials:

<!-- Parent container for the the below list and displaying addresses-->
<div class="container-fluid py-3 px-1  h-100">
    <div class="row">
        <!-- Column which contains the list of all the contacts present currently -->
        <div class="col-4 ">
            <ul class="list-group contact-list-cards">
                @foreach (var contact in Model.Contacts)
                {
                    <li class="list-group-item py-0 px-3 position-relative">
                        <a class="stretched-link contact-name  curson_pointer text-decoration-none name-heading m-0"
                           href="#"
                           id="listItem"
                           onclick="loadDetails(@contact.Id)" >@contact.Name </a>
                        <p class=" text-secondary m-0 mx-2 ">@contact.Email</p>
                        <p class=" text-secondary m-0 mx-2 mb-2">+91 @contact.MobileNumber</p>
                    </li>
                }
            </ul>
        </div>

        <!-- Column which will display the informaation when clicked on the specific list item of contact -->
        <div id="contactdetail" class="ml-5">
            <partial name="_contactDetail" model="@Model.Contacts.ElementAtOrDefault(0)" />
        </div>

    </div>
</div>

Обратитесь к частичному методу в Index.chtml.cs:

        public IActionResult OnPostContactPartial(int id)
    {
        Debug.WriteLine("func called {0}", id);
        Contact contact = contactDetails.GetContact(id);
        return Partial("_contactDetail", contact);
    }

Если я не передаю какой-либо идентификатор, а просто передаю конкретный контакт (например, контакт с идентификатором 3), он работает нормально, т.е. когда я нажимаю на любой контакт ITem, он отображается, но когда я передаю поле идентификатора, я получаю ошибка 404.

Вот моя папка в каталоге:  введите описание изображения здесь

Пожалуйста, помогите мне. Как я могу это сделать. Спасибо


person VR7    schedule 25.12.2020    source источник


Ответы (2)


Используйте метод InvokeAsync вместо Invoke в файле ContactDetailsViewComponent.cs

person Mahesh Sv    schedule 26.12.2020
comment
братан, но мы также должны изменить данные, которые мы передаем компоненту просмотра, как мы можем это сделать ?? - person VR7; 26.12.2020
comment
для меня звучит как работа для javascript, вызовите конечную точку api и верните нужный вам json - person Walter Vehoeven; 26.12.2020
comment
@WalterVehoeven, сэр, уточните свой ответ, я не могу понять, вы хотите использовать для этого ajax и jquery? В MVC я думаю, что мы можем сделать это с помощью метода загрузки из ajax, но я понятия не имею о бритвенных страницах и нам также нужно передать идентификатор в качестве параметра, - person VR7; 26.12.2020
comment
вместо того, чтобы делать почтовый ящик и снова получить всю страницу, используйте jquery и получите данные и обновите веб-страницу, используя ответ, посмотрите stackoverflow.com/questions/1309452/ - person Walter Vehoeven; 27.12.2020

Вы можете использовать ajax на странице razor так же, как и в mvc.

Сначала создайте новую страницу бритвы, вы можете назвать ее ContactDetails.cs:

public class ContactDetailsModel : PageModel
{
    private readonly IContactDetails contactDetails;

    public ContactDetailsModel(IContactDetails _contactDetails)
    {
        contactDetails = _contactDetails;
    }

    public Contact Contact { get; set; }

    public void OnGet(int id)
    {
        var contact = contactDetails.GetContact(id);
        Contact = contact;
    }
}

И добавьте подробную информацию о контакте на странице ContactDetails.cs.cshtml (для простоты я просто показываю четыре поля)

@page
@model RazorTest.Pages.ContactDetailsModel
@{
    Layout = null;
}

@Model.Contact.Id
@Model.Contact.Name
@Model.Contact.Email
@Model.Contact.MobileNumber

Затем в Index.chtml используйте ajax в функции щелчка привязки:

<script>
    function loadDetails(contactId) {
        $.ajax({
            type: 'get',
            url: 'ContactDetails?id='+contactId,
            success: function (result) {
                $("#contactdetail").html(result);
            }
        })
    }
</script>

Результат:

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

person mj1313    schedule 28.12.2020
comment
Большое спасибо, сэр, я постараюсь сделать это, но, сэр, на самом деле я пытаюсь сделать это частичным представлением, я вызвал метод сведений о загрузке, аналогичный вашему, но я получаю ошибку 404, пожалуйста, можете ли вы увидеть код, я разместил его в вопросе. - person VR7; 28.12.2020
comment
@ VR7, Маршрут на странице Razor отличается от маршрута в MVC, измените его, как показано ниже: '/Contacts/Index?handler=ContactPartial&id='+id, а обработчик должен быть OnGetContactPartial, поскольку вы отправляете запрос на получение. - person mj1313; 28.12.2020
comment
Большое спасибо, сэр, я пытался решить эту проблему в течение 2 дней, да, я также немного подумал, почему он отправляет запрос, хотя раньше я отправлял данные, и этот один URL вызывал столько проблем, я искал много мест, но в основном я нашел решения для MVC вместо бритвенных страниц. Большое спасибо, сэр, сэр, не могли бы вы поделиться ссылкой на некоторые ресурсы, где я могу изучать и практиковать ajax и jquery, поскольку я новичок в ядре asp.net. - person VR7; 28.12.2020
comment
@ VR7, сначала официальный документ страница razor и руководства с этого сайта также очень хороши. Для вопроса ajax и jquery вы можете просто выполнить поиск в зависимости от конкретной ситуации, в stackoverflow или google, кто-то должен был сталкиваться с подобными проблемами раньше. - person mj1313; 28.12.2020