我有一个类似下面的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
答案 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"];
//...
}