У меня есть два представления, которые будут использовать один и тот же метод контроллера:
//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/