ASP.NET-MVC не отображает вид - PullRequest
       1

ASP.NET-MVC не отображает вид

0 голосов
/ 07 января 2019

У меня есть список меню, отображаемый в браузере как список тегов привязки. Когда пользователь нажимает, я передаю его идентификатор контроллеру с помощью ajax следующим образом:

<!DOCTYPE html>
<script type="text/javascript">
    $(document).on('click', 'a', function () {
        var Url = $(this).attr("href");
            $.ajax({
                type: 'POST',
                url:Url,
                contentType: 'application/json; charset:utf-8',
                data: JSON.stringify({ id: this.id })
            })
        });
</script>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <link href="/Content/bootstrap.css" rel="stylesheet">
    <title>ShopOnline</title>
</head>
<body>
    <div id="soContainer">
        <div id="soCategories">
            <div class="container">
                <ul class="list-inline">
                    <li>
                        <a href="#" id="everything">Everything</a>
                        <ul id="catUL">
                            @foreach (var c in Model.CategoriesWithCount)
                            {
                                <li>
                                    <a id="@c.Key" href ="@Url.Action("ListOfBrandNames","Home")">@c.Key</a>
                                    (@c.Value)
                                </li>
                            }
                        </ul>
                    </li>
                </ul>
                <ul class="list-inline" id="topMenu">
                    <li><a href="#">Bought Before</a></li>
                    <li><a href="#">Specials</a></li>
                </ul>
            </div>
        </div>
    </div>
</body>
</html>

Теперь этот идентификатор передается следующему методу действия в качестве параметра, чтобы получить список строк (т. Е. Фирменных наименований) для отправки на View как:

    [HttpPost]
    public ActionResult ListOfBrandNames(string id)
    {
        var result = db.Items.Where(x => x.Category.Name.Equals(id)).Select(x => x.BrandID).ToList();
        var ListOfBrands = db.Brands.Where(t => result.Contains(t.BrandID)).ToList();

        var brandNanes = ListOfBrands.Select(f => f.Name.ToString()).ToList();
        return View(brandNanes);
    }

Выше кода успешно передает требуемый список строк следующим View как:

@model List<string>
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>ListOfBrandNames</title>
</head>
<body>
    <table>
        <tr>
            @foreach (var i in Model)
            {
                <td>
                    @i.ToString();
                </td>
            }
        </tr>
    </table>
</body>
</html>

для цикла в View успешно выполняется для всех элементов в списке, но программа разрывается с 404 Error в браузере, когда список заканчивается в цикле for. Я неправильно называю View или как?

Ответы [ 2 ]

0 голосов
/ 07 января 2019

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

  1. Вы можете просто использовать тег кнопки вместо тега, возможно, вам придется использовать некоторые CSS, чтобы он выглядел как тег

2. Вам не нужно указывать URL-адрес в свойстве href тега, если вы на самом деле не хотите использовать его как обычный тег.

например, вы можете поместить его в атрибут data-href

 <a id="@c.Key" data-href ="@Url.Action("ListOfBrandNames","Home")">@c.Key</a>
...
var Url = $(this).attr("data-href");

это предотвратит попытку перехода тега к этому URL при нажатии на него. обратите внимание, что это может привести к изменению значка курсора, вы можете исправить это, установив href="#" или style="cursor:pointer"

0 голосов
/ 07 января 2019

Вы делаете два отдельных запроса, когда нажимаете на ссылку. Во-первых, ваш запрос AJAX, который успешно выполняется. Но, поскольку вы нажимаете на ссылку, вы также делаете стандартный запрос GET, когда ваш браузер пытается перейти по этой ссылке. Этот второй запрос не выполняется, потому что GET не разрешен для этого действия контроллера.

Вы можете отменить запрос по умолчанию в своем коде JavaScript:

$(document).on('click', 'a', function (e) {
    e.preventDefault();
    // the rest of your code...
});

Или вы можете сохранить текущий шаблон использования # в своих ссылках и сохранить URL-адрес в другом месте, отличном от href. Что-то вроде:

<a id="@c.Key" href="#" data-href="@Url.Action("ListOfBrandNames","Home")">@c.Key</a>

и в вашем JavaScript:

var Url = $(this).data("href");

Или, возможно, полностью заменить ссылку кнопкой (я подозреваю, что это будет более семантически правильным):

<button type="button" id="@c.Key" data-href="@Url.Action("ListOfBrandNames","Home")">@c.Key</button>

Таким образом, он не будет иметь действия по умолчанию (но, конечно же, будет учитывать любые теги <form>), а будет использоваться только для вызова операции на стороне клиента, что вы и делаете в код в любом случае.

<ч />

В любом случае вам решать, но главное - вам нужно запретить браузеру отправлять GET-запрос на ваше действие только для POST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...