Как вернуть два разных представления из одного действия в ASP.NET MVC? - PullRequest
0 голосов
/ 13 января 2011

У меня есть два представления, которые будут использовать один и тот же метод контроллера:

//webServiceController.cs

//The actual method is about 40 lines of code. Truncated for readability.
public ActionResult Index()
{
    object i = new List<WebServiceMethod>();
    i = svcService.populateList("Programs");

    return View(i);

}

Первое представление - это HTML-страница, которая отображает данные в виде красивой таблицы:

<% // Index.aspx %>

<table>
<tbody>
<% foreach (var item in Model) { %>

<tr>
    <td>
        <% if (Convert.ToInt32(item.numberRequests) > 0)
        {%>
            <%= Html.ActionLink("Details", "Details", new { programNumber = item.programNumber })%>
        <%} %>
    </td>
    <td>
        <%= Html.Encode(item.programNumber) %>
    </td>
</tr>

<% } %>
</tbody>
</table>

Второе представление - это быстрое и грязное преобразование в JSON, так что я могу делать волшебные трюки AJAX с данными:

<% 
    // AjaxGetServiceData.aspx

    // Convert web service response object into JSON for AJAX.
    var jss = new System.Web.Script.Serialization.JavaScriptSerializer();
    Response.Write(jss.Serialize(Model));

%>

Я создал дубликат метода Index() и назвал его AjaxGetServiceData(), но это противоречит цели MVC.


Разрешение:

Я не очень хорошо задавал свой вопрос, о чем свидетельствует 5-10-минутное обсуждение, которое я только что провел с коллегой по этой самой теме. Он продолжал задавать мне один и тот же вопрос, который задавали мне многие пользователи на этой странице: «Как контроллер узнает, какое представление вернуть?» Я ответил: «Вот что я пытаюсь выяснить». Я пытался заставить метод возвращать другое представление (или вывод Json), когда AJAX был инициатором запроса. Строковый аргумент в методе был моим решением.

Вот что я использовал для получения желаемого эффекта:

public ActionResult Index(string isJSON = "no")
{

    /// ...All the code from before...

    if (isJSON == "yes")
    {
        return Json(i, JsonRequestBehavior.AllowGet);
    }
    else
    {
        return View(i);
    }

}

Затем, когда я хочу версию JSON, в своем запросе AJAX я указываю URL как /MyController/Index/?isJSON=yes

Когда мне нужен мой красивый вид таблицы, я просто использую /MyController/

Ответы [ 3 ]

3 голосов
/ 13 января 2011
public ActionResult Index()
{
    object i = new List<WebServiceMethod>();
    i = svcService.populateList("Programs");

    if (someCondition)
        return View(i);
    else
        return View("AjaxGetServiceData", i); // or whatever you called your view.aspx
}
2 голосов
/ 13 января 2011

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

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

0 голосов
/ 30 апреля 2012

"... Я пытался заставить метод вернуть другое представление (или вывод Json), когда AJAX был запрашивающим ..."

public ActionResult Index()
{
    object i = new List<WebServiceMethod>();       
    i = svcService.populateList("Programs");       

    if (Request.IsAjaxRequest == "True")
    {
        return Json(i, JsonRequestBehavior.AllowGet);           
    }
    else
    {
        return View(i)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...