什么是在mvc中使用web api的最佳方式

时间:2016-05-10 01:51:50

标签: asp.net asp.net-mvc-4 asp.net-web-api

我在我的mvc应用程序中使用web api。我在web api中有方法,它使用userId返回用户详细信息(在会话[“userID”]中)

public object getUserDetail()
{
  //here is need of session["userID"]
  // return somthing
}

那么从jquery访问这个web api方法的最佳方法是什么。我应该直接访问它还是首先我应该调用我的控制器方法,然后我应该调用这个web api方法。

4 个答案:

答案 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控制器中的会话来描述您尝试解决的问题,然后我们可以尝试就此发表意见。