问题描述
|
我有一个类似下面的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
解决方法
最好的选择是重构代码,以将GetData()中的当前逻辑转换为它自己的函数,将Json作为Json从该逻辑返回到当前GetData,然后在新的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()方法将其返回,因为我相信它将进一步第二次对其进行序列化。因此,在这种情况下,我将其作为纯字符串返回。这是您要找的东西吗?
, 使用辅助方法从控制器执行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\"];
//...
}