如何将Json ActionResult变成字符串

时间:2011-05-31 20:53:39

标签: asp.net-mvc json string

我有一个类似下面的Controller方法(我不想改变):

public class UserController : Controller
{

    public ActionResult GetData(......) 
    {

      var  returnData = ......

      ........................
      ........................

      return Json(returnData, JsonRequestBehavior.AllowGet);
   }
}

现在我想在不同的控制器的方法和方法中调用上面的方法。想要出于某种目的得到这个Json数据..

public class UtilityController : Controller
{

    public ActionResult MyMethod(......) 
    {

      string actionURL = "/User/GetData/123";

      string userDataInString = **???????????????????**

      userDataInString = userDataInString + ".........................";

      return Json(userDataInString , JsonRequestBehavior.AllowGet);
    }
}

所以我想知道如何使用 actionURL 调用 UserController GetData 来分配 userDataInString

2 个答案:

答案 0 :(得分:0)

你最好的选择是重构你的代码,使GetData()中的当前逻辑进入它自己的函数,将Json从那里返回到当前的GetData作为Json,然后在你的新MyMethod()中调用重新计算的方法并如你所描述的那样追加它。

[NonAction]    
public ActionResult RefactoredGetData(...)
{
   ..............
   ..............
}

public ActionResult GetData(...)
{
   var returnData = RefactoredGetData(...)
   return Json(returnData, JsonRequestBehavior.AllowGet);
}

public string MyMethod(...)
{
   string actionURL = "/User/GetData/123";
   string userDataInString = new JavaScriptSerializer().Serialize(RefactoredGetData(...));
   userDataInString = userDataInString + ".........................";
   return userDataInString;
}

请注意,因为序列化程序已经在JSON中返回数据,所以你无法使用Json()方法返回它,因为我相信它会再次序列化它。所以我在这种情况下将它作为普通字符串返回。这是你在找什么?

答案 1 :(得分:0)

使用辅助方法从控制器执行GET请求。

public ActionResult MyMethod(......) 
    {

    string controller = "UserController";
    string action = "GetData";
    string query = "123";
    string address = Request.Url.GetLeftPart(System.UriPartial.Authority) + Url.Action(action, controller) + "/" + query;

     string userDataInString = GetRequest(address);//address in place of actionUrl
     userDataInString += ".........";
     return Json(userDataInString , JsonRequestBehavior.AllowGet);
     }

        private string GetRequest(string address)
        {
                WebClient client = new WebClient ();//pick your poisen...
                return client.DownloadString (address);
        }

除非您有充分的理由使用RESTful方法...如果您控制了请求的两端,我建议您将其移至BL中以节省HTTP请求。

<小时/> 来自Cookie的Json

private void GetRequestCreateCookie(string address)
{
    var myCookie = new HttpCookie("aCookie");           
    var client = new WebClient();
    myCookie["jsonResponse"] = client.DownloadString(address);
    myCookie.Expires = DateTime.Now.AddMinutes(1);//some amt of time       

    // Add the cookie.
    Response.Cookies.Add(myCookie);            
}

阅读(在真实应用中检查空值)......

    [HttpPost]
    public ActionResult SomeMethod(/*param(s)*/)
    {
        HttpCookie cookie = Request.Cookies["aCookie"];
        string answer = cookie["jsonResponse"];
        //...
     }