如何从ASP.NET MVC中的同一个Action返回两个不同的视图?

时间:2011-01-13 17:36:26

标签: c# ajax asp.net-mvc

我有两个视图都使用相同的Controller方法:

//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分钟的讨论所证明的那样。他一直问我同样的问题,这个页面上的很多用户都问我:“控制器如何知道返回哪个视图?”我回答说:“这就是我想弄清楚的。”当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/

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:2)

听起来你有两个不同的目的,在这种情况下,当你谈到不同的控制器方法时,我认为你是正确的。

当然,重用每个控制器方法中的代码,但如果你想要一个不同的结果,请使用不同的方法并保持控制器方法的简单。

答案 2 :(得分:0)

“...当AJAX是请求者时,我试图让方法返回不同的视图(或Json输出)......”

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)
    }
}