我有將兩者都使用相同的控制器方法的兩個視圖:如何從ASP.NET MVC中的相同動作返回兩個不同的視圖?
//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>
第二種觀點一個quick'n'dirty轉換成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));
%>
我已經創造了的副本方法並將其稱爲AjaxGetServiceData()
,但這違背了MVC的目的。
分辨率:
我沒有問我的問題非常好,通過5-10分鐘的討論,我只是有一個關於這個題目的同事證明。他不停地問我同樣的問題,本頁上的許多用戶問我:「控制器如何知道要返回哪個視圖?」我回答說:「那正是我想要弄清楚的。」當AJAX是請求者時,我試圖讓方法返回不同的視圖(或Json輸出)。該方法中的字符串參數是我的解決方案。
這是我最後用得到我想要的效果:
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/
你是不是想** *結合*這兩個代碼片段放到一個HTML頁面中? – 2011-01-13 17:40:13
您的視圖是否有任何特定的原因從模型中生成JSON,而不是您的控制器?在我看來,你應該使用`return Json(i);`作爲JSON輸出。 – 2011-01-13 17:42:15