2012-03-28 126 views
0

我想在MVC中建立一个通用的导出操作获取来自控制器的数据。所以我为此写了一个控制器。在另一个控制器

[AcceptVerbs(HttpVerbs.Post)] 
public string Excel(FormCollection collection) 
{ 
    string dataUrl = collection["dataUrl"]; 
    string filter = collection["filter"]; 
    //Get data from dataUrl 
    ... 
} 

我的问题是我想通过相同的参数传递给它的方法POST获取数据从另一个控制器转移。

这是用于预先数据

[AcceptVerbs(HttpVerbs.Post)] 
public JsonResult List(FormCollection collection) 
{ 
    ... 
    return Json(data); 
} 

感谢样品的方法。

+0

为什么你需要那个?为什么不在另一个类中使用该逻辑并从两个控制器中调用它? – ivowiblo 2012-03-28 15:00:22

+0

我有很多控制器,并不想对其进行更改。 – 2012-03-28 15:03:56

+0

假设你是在MVC3,另一项建议(虽然不是100%的质疑有关)是停止使用FormCollections并使用默认的模型绑定设备,并从您的解决方案使用真正的域对象。这将有助于您更多地拥有不同的服务/实用程序类来执行实际导出,并且控制器中的代码更少。 – Uchitha 2012-03-28 15:05:00

回答

1

为什么不重构出口代码放到一个工具类,然后从两个控制器使用它呢?

0

假设你绝对要呼叫控制器到控制器,你可以使用一个HttpWebRequest的,像这样:

public void CallController() 
    { 
     var request = (HttpWebRequest)WebRequest.Create("http://yoursite.com/Excel"); 
     request.Method = "POST"; 

     using (var dataStream = request.GetRequestStream()) 
     { 
      //write your data to the data stream 
      using (var response = (HttpWebResponse)request.GetResponse()) 
      { 
       if (response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.TemporaryRedirect) 
       { 
        //work with the controller response 
       } 
      } 
     } 
    } 

这是非常低效的,如果你能重构代码到外部两个控制器类。

+0

我想这已经,申请使用窗体身份验证所以这个电话给我登录页面作为响应。通过重构代码的方式为所有数据方法添加另一个控制器方法对我来说不是一个好的解决方案。 – 2012-03-29 06:56:24

+0

将您的控制器作为post方法公开,没有视图,也没有get方法。然后,您可以删除您的方法的身份验证。 – BentOnCoding 2012-03-29 14:50:40

+0

如果您真的担心暴露控制器方法而不进行身份验证,您可以进行某种令牌安全握手,但这超出了此问题的范围。 – BentOnCoding 2012-03-29 14:51:31

相关问题