如何从ASP.NET MVC中的相同动作返回两个不同的视图?

问题描述:

我有将两者都使用相同的控制器方法的两个视图:如何从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

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 
} 

这听起来像是你在这种情况下,我想你会以正确的方式两个不同的目的当你谈论不同的控制器方法时。

当然,重用每个控制器方法中的代码,但是如果你想得到不同的结果,可以使用不同的方法并保持控制器方法的简单。

“......我一直想把该方法返回一个不同的视图(或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) 
    } 
}