2011-01-13 88 views
0

我有將兩者都使用相同的控制器方法的兩個視圖:如何從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/

+0

你是不是想** *結合*這兩個代碼片段放到一個HTML頁面中? – 2011-01-13 17:40:13

+1

您的視圖是否有任何特定的原因從模型中生成JSON,而不是您的控制器?在我看來,你應該使用`return Json(i);`作爲JSON輸出。 – 2011-01-13 17:42:15

回答

3
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

這聽起來像是你在這種情況下,我想你會以正確的方式兩個不同的目的當你談論不同的控制器方法時。

當然,重用每個控制器方法中的代碼,但是如果你想得到不同的結果,可以使用不同的方法並保持控制器方法的簡單。

0

「......我一直想把該方法返回一個不同的視圖(或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) 
    } 
} 
相關問題