Можно ли использовать один .net ASP MVC Controller для двух «панелей» - PullRequest
0 голосов
/ 25 января 2012

Я учусь изучать шаблон asp mvc и немного потерян на контроллерах. Веб-страница, которую я создаю, должна иметь поиск «Панель» слева и окно данных справа.

Это задача для одного контроллера или двух? Мне нужно, чтобы пользователь вводил данные на панели поиска, нажимал кнопку «Перейти» и затем отображал результаты на этой панели.

Все это выглядит довольно просто под одним контроллером, но ...

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

Ответы [ 2 ]

1 голос
/ 25 января 2012

То, что вы описываете, может быть достигнуто множеством способов, но звучит так, будто вы думаете о «контроллере», как страница. Контроллер содержит несколько методов, каждый из которых будет выполнять действие (возможно, это может быть рендеринг страницы). Контроллер представляет не веб-страницу, а набор выполненных действий (перенаправления, GET, POSTS и т. Д.).

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

  1. Нет, это, вероятно, не работа нового контроллера.
  2. Да, но, вероятно, не то, что вы хотите.

Скорее всего, у вас будет только один контроллер, но два метода для фазы поиска Get и Post поиска. То, как вы заполняете каждую панель, вызывает много вопросов:

  • Вы заставите обновление страницы при поиске?
  • Аякс перезагрузится?
  • Не дай бог, кадры?
  • Панель Javascript?

Пожалуй, проще всего начать с первого варианта - принудительного обновления страницы при поиске.

public class MyController : Controller
{
    // GET
    public ActionResult Index()
    {
        return View();
    }

    // POST
    [HttpPost]
    public ActionResult Index(string searchWord)
    {
        // Perform whatever steps involved in finding things
        IEnumerable<MyResults> results = _service.Search(searchWord);

        // Pass the result into the view
        return View(results);
    }
}

Затем быстрый и простой просмотр:

@model IEnumerable<MyResults>

<div id="panel_1">
@using(Html.BeginForm())
{
    <input type="text" name="searchWord" />
    <button type="submit">Go</button>
}
</div>

<div id="panel_2">
    @if(Model != null)
    {
        <ul>
            @foreach(var result in Model)
            {
                <li>@result.Name</li>
            }
        </ul>
    }
</div>

Отсюда соединение с Ajax довольно просто.

Редактировать - Шаг 2 - Ajax вещи.

Действиям контроллера не нужно возвращать целое представление - они могут возвращать частичное в запрос ajax.

Итак, добавьте частичное хотя бы для панели 2:

Index.cshtml:

@*
    Panel 1 remains the same.  Or could move it do it's own partial and
    render it via Html.RenderPartial("Panel1")
*@
<div id="panel_1">
    @using(Html.BeginForm())
    {
        <input type="text" name="searchWord" />
        <button type="submit">Go</button>
    }
</div>

@* This is now just a placeholder since it will be populated via ajax. *@
<div id="panel_2"></div>

Создать новый вид, Panel2.cshtml

@model IEnumerable<MyResults>

@if(Model != null)
{
    <ul>
        @foreach(var result in Model)
        {
            <li>@result.Name</li>
        }
    </ul>
}
else
{
    <i>Nothing found</i>
}

Затем измените действие контроллера:

// POST
[HttpPost]
public ActionResult Index(string searchWord)
{
    // Perform whatever steps involved in finding things
    IEnumerable<MyResults> results = _service.Search(searchWord);

     // Pass the result into the partial view for panel 2
     return View("Panel2", results);
}

Единственный слева - какой-то javascript, чтобы связать все это вместе (не могу сделать все это с моей головы)

$(document).ready(function() {
    $('#panel_1 form').submit(function() {
        $.post({
            url: this.action,
            success: function(response) {
                // Replace the contents in panel 2
                $('#panel_2).html(response);
            }
        });
    });
});
1 голос
/ 25 января 2012

Кажется, что и ваша панель поиска, и ваша панель результатов (результатов) находятся в поисковом «контексте». Вполне допустимо, чтобы они обрабатывались одним контроллером.

Когда люди начинают MVC, они получают много советов, чтобы иметь контроллер для каждой сущности. Это хороший совет для изучения MVC в контексте CRUD, но может привести к некоторой путанице при перемещении мимо Entity CRUD.

В вашем случае используйте SearchController.

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