我在我的mvc应用程序中使用web api。我在web api中有方法,它使用userId返回用户详细信息(在会话[“userID”]中)
public object getUserDetail()
{
//here is need of session["userID"]
// return somthing
}
那么从jquery访问这个web api方法的最佳方法是什么。我应该直接访问它还是首先我应该调用我的控制器方法,然后我应该调用这个web api方法。
答案 0 :(得分:0)
WebApi已经是您从中访问数据的公开端点。转到你的控制器,从那里调用方法减少了首先将方法暴露为Api的意图。尝试拨打Api方法的路线,你应该没问题。
在旁注中,尝试暴露强类型对象而不是仅返回对象。
答案 1 :(得分:0)
您可以直接从jquery调用WebApi来执行操作(如插入/更新/删除),而不是返回JSON进行处理。对于需要操作视图的场景,请调用调用Webapi的mvc控制器。 因此,对于您的情况,getUserDetail()方法返回数据。如果需要在视图中使用这些返回值,请从mvc controller
中调用它答案 2 :(得分:0)
从jquery
访问此Web api方法的最佳方法是什么
只需拨打ajax电话即可。
Public Shared Function nranagajati() As Integer
Dim totalangajati As Integer
Dim startDate As String = DateTime.Now.ToString("yyyy/MM/dd")
Dim con As New SqlConnection
Try
con = New SqlConnection("Data Source=SVNAV;Initial Catalog=NAV_Vermorel_Live;User ID=sa;Password=1234")
Using cmd As SqlCommand = New SqlCommand("SELECT Prezenti FROM [SC Vermorel SRL$PrezentaSchimb] WHERE ([Schimb] = '" & ProceseazaSCH(Now()) & "') AND (cast(CONVERT(varchar(8), Data, 112) AS datetime) = @data2)", con)
cmd.Parameters.AddWithValue("@data2", startDate)
con.Open()
totalangajati = Convert.ToInt32(cmd.ExecuteScalar())
con.Close()
End Using
Catch ex As Exception
Console.WriteLine(ex.Message)
Finally
If con IsNot Nothing Then
If con.State = ConnectionState.Open Then
con.Close()
End If
con.Dispose()
End If
End Try
Return totalangajati
End Function
让控制器返回值。
var url = www.example.com/api/user;
$.ajax({
type: 'GET',
url: url,
success: function(userValue) {
// Do something with your user info...
},
error: function(error) {
// Something went wrong. Handle error.
}
});
要获取控制器的网址,您可以在视图中使用此功能。
public class UserController : ApiController
{
[HttpGet] // For clarity only
public object Get()
{
// return your object.
return session["userID"];
}
}
其中Url.HttpRouteUrl("DefaultApi", new {controller = "UserController "})})
是路由表中定义的路由名称(通常在RouteConfig.cs中)。
修改强>
关于会话的访问,有很多方法可以解决这个问题。看看这个问题,我想你会解决它。 Accessing Session Using ASP.NET Web API
或者本教程: http://www.codeproject.com/Tips/513522/Providing-session-state-in-ASP-NET-WebAPI
DefaultApi
最后将其注册到您的路线:
public class SessionableControllerHandler : HttpControllerHandler, IRequiresSessionState
{
public SessionableControllerHandler(RouteData routeData)
: base(routeData)
{}
}
public class SessionStateRouteHandler : IRouteHandler
{
IHttpHandler IRouteHandler.GetHttpHandler(RequestContext requestContext)
{
return new SessionableControllerHandler(requestContext.RouteData);
}
}
或者将此添加到您的Global.asax.cs
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
).RouteHandler = new SessionStateRouteHandler();
答案 3 :(得分:0)
感觉您可能想要退后一步并重新思考基础知识。这里的主要问题是:一个视图层(MVC)调用另一个视图层(web api)听起来是否正确?简单的答案是:没有。
通常的设置是你的ajax调用直接定位你的Web Api控制器方法。但是如果出于某种原因,你发现自己认为你真的需要你的MVC来调用WebApi然后寻找提取业务逻辑来分离层/层,那么你最终得到的是MVC和Web API,在单独的类中调用相同的方法/ layer(无论你的方法是什么)。
所以,而不是:
//this is in your MVC controller
public ActionResult SomeMVCAction(){
MyWebApiMethod();
}
//This is in your web api controller
public SomeStrongType MyWebApiMethod(){
var sum = 2+2;
}
你可能想要这样的东西:
//this is in your MVC controller
public ActionResult SomeMVCAction(){
DoSum();
}
//This is in your web api controller
public SomeStrongType MyWebApiMethod(){
DoSum()
}
///This function is defined in separate layer/project which is your business layer
public static int DoSum(){
return 2+2;
}
PS。 关于会话...有一个原因可以在WebApi中轻松访问会话。 REST Api应该是无状态的,因此您可能需要重新考虑您在web api控制器中需要会话的设计。 您可以通过访问web api控制器中的会话来描述您尝试解决的问题,然后我们可以尝试就此发表意见。