2015-08-19 4 views
2

Я работаю над приложением, используя asp.net mvc 4. Здесь я хочу использовать автозаполняющий расширитель, используя JQuery, где я хочу заполнить все местоположение этого CityID, которое хранится в сеансе.Как использовать сеанс в apicontroller в asp.net mvc 4

Вот функция для создания сеанса:

public string Create(string City) 
{ 
    try 
    { 
     //HttpSessionStateBase Session["c"]=City; 
     //HttpContext.Current.Session["City"] = City; 
     System.Web.HttpContext.Current.Session["City"] = City; 
     long CityID = Convert.ToInt64(System.Web.HttpContext.Current.Session["City"].ToString()); 

     return City; 
    } 
    catch (Exception ex) 
    { 
     throw (ex); 
    } 
} 

Эта функция вызывается, когда пользователь выбирает любой город из города dropdownlist.

Мои JQuery вызова для автозаполнения удлинителя:

<script type="text/javascript"> 
var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "ProductApi" })'; 
$('#txtLocation').autocomplete({ 
    source: function (request, response) { 
     alert(url); 
     $.ajax({ 
      url: url, 
      data: { query: request.term }, 
      dataType: 'json', 
      type: 'GET', 
      success: function (data) { 
       response($.map(data, function (item) { 
        return { 
         label: item.Name 
         //value: item.ID 
        } 
       })); 
      } 
     }) 
    }, 
    select: function (event, ui) { 
     $('#txtLocation').val(ui.item.label); 
     //$('#ID').val(ui.item.value); 
     return false; 
    }, 
    minLength: 1 
}); 

Мой контроллер АФИ:

public class ProductApiController : ApiController 
{ 
    SqlConnection cnn = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["SQLCONN"].ToString());   

    [HttpGet] 
    public IEnumerable<Search> GetProducts(string query = "") 
    { 
     cnn.Open(); 
     //string gid = GETSession("t"); 

     long CityID = Convert.ToInt64(System.Web.HttpContext.Current.Session["City"].ToString()); 

     SqlCommand cmd = new SqlCommand("Check_PrefixText", cnn); 
     cmd.Parameters.AddWithValue("City", CityID); 
     cmd.Parameters.AddWithValue("@Prefix", query); 

     cmd.CommandType = CommandType.StoredProcedure; 

     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     DataTable dt = new DataTable(); 
     da.Fill(dt); 

     //var result = IEnumerable<City>(query); 
     Search obj = new Search(); 
     cnn.Close(); 
     return dt.AsEnumerable().Select(row => 
     { 
      return new Search 
      { 
       Name = Convert.ToString(row["Name"]), 
      }; 
     }); 
    } 
} 

В Global.asax файл я написал 2 метода:

protected void Application_PostAuthorizeRequest() 
{ 
    if (IsWebApiRequest()) 
    { 
     HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required); 
    } 
} 

private bool IsWebApiRequest() 
{ 
    return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(WebApiConfig.UrlPrefixRelative); 
} 

В webApiConfig класса я написал следующим образом:

public static string UrlPrefix { get { return "api"; } } 
public static string UrlPrefixRelative { get { return "~/api"; } } 

public static void Register(HttpConfiguration config) 
{ 
    config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: WebApiConfig.UrlPrefix + "/{controller}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 
} 

Но все же значение session["City"] приходит нуль в ApiController в то время как там есть значение, хранящееся показ в session["City"].

ответ

2

Изменение API для:

[HttpGet] 
public IEnumerable<Search> GetProducts(long cityID, string query = "") 
{ 

затем передать свой CityId с данными

data: { 
    cityID: $("#cityDropDownId :selected").val(), 
    query: request.term 
}, 

Забудьте о попытке использовать «сеанс» - это не правильная технология для того, что вы пытаетесь делать.

+0

Thanx много. Он отлично работает для меня. –

+0

Если я хочу называть web api с клиентской стороны, а не контроллером mvc? –

2

Просто, вы не можете. Web Api придерживается REST, который, среди прочего, является stateless. Это означает отсутствие сеанса. Каждый запрос, удовлетворяющий требованиям REST, должен содержать все необходимые ему данные для запроса в самом запросе (либо как часть строки запроса в GET, либо в теле в POST, PUT и т. Д.).

При этом регулярные действия контроллера MVC могут также возвращать JSON, XML и т. Д., Поэтому вы можете настроить конечную точку для своего запроса AJAX в контроллере MVC и коснуться сеанса оттуда. Вы просто не можете сделать это от ApiController.

+1

Это может быть справедливо сказать, «вы не должны.» Поскольку этот метод действительно работает, неточно сказать, «вы не можете». См. Также https://stackoverflow.com/questions/9594229/accessing-session-using-asp-net-web-api. – BillVo

0

Используя SetSessionStateBehavior, вы можете решить эту проблему. Позволь мне объяснить.

Global.asax.CS

public class MvcApplication : System.Web.HttpApplication 
{ 
    ... 

    protected void Application_PostAuthorizeRequest() 
    { 
     if (IsWebApiRequest()) 
     { 
      HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required); 
     } 
    } 

    private bool IsWebApiRequest() 
    { 
     return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(WebApiConfig.UrlPrefixRelative); 
    } 

} 

Запишите это два метода в global.asax.cs с помощью SetSessionStateBehavior вы можете получить доступ к сессии в ApiController

+0

Я сделал это. Пожалуйста, взгляните на мой вопрос. –

+0

Вам нужно поместить это в класс WebApiConfig: 'public static string UrlPrefix {get {return" api "; }} общедоступная статическая строка UrlPrefixRelative {get {return "~/api"; }} ' – Javysk

Смежные вопросы