C# 如何在asp.net mvc 4中使用ApicController中的会话
我正在使用asp.net mvc 4开发一个应用程序。在这里,我想使用AutoCompleteExtender使用C# 如何在asp.net mvc 4中使用ApicController中的会话,c#,jquery,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Jquery,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我正在使用asp.net mvc 4开发一个应用程序。在这里,我想使用AutoCompleteExtender使用JQuery,在这里我想填充存储在会话中的CityID的所有位置 以下是创建会话的函数: public string Create(string City) { try { //HttpSessionStateBase Session["c"]=City; //HttpContext.Current.Session["City"] =
JQuery
,在这里我想填充存储在会话中的CityID
的所有位置
以下是创建会话的函数:
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);
}
}
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"]),
};
});
}
}
protected void Application_PostAuthorizeRequest()
{
if (IsWebApiRequest())
{
HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
}
}
private bool IsWebApiRequest()
{
return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(WebApiConfig.UrlPrefixRelative);
}
当用户从citydropdownlist
中选择任何城市时,将调用此函数
我的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 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 }
);
}
在webApiConfig
类中,我写了如下内容:
<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 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
中出现null,而session[“City”]
中存储的值显示在session[“City”]中,简单地说,您不能。WebAPI遵循REST,REST是无状态的。这意味着没有会议。每个符合REST的请求必须在请求本身中包含请求所需的所有数据(作为GET中查询字符串的一部分或POST、PUT等中的正文)
这就是说,常规的MVC控制器操作也可以返回JSON、XML等,因此您可以在MVC控制器中为AJAX请求设置端点,并从此处触摸会话。您无法通过ApiController将API更改为:
[HttpGet]
public IEnumerable<Search> GetProducts(long cityID, string query = "")
{
忘记尝试使用“会话”-对于您尝试执行的操作,它不是正确的技术。使用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);
}
}
使用SetSessionStateBehavior
在global.asax.cs
中写下这两个方法,您可以在apicController
中访问会话,您需要将其放在WebApiConfig类中:公共静态字符串UrlPrefix{get return“api”}}公共静态字符串UrlPrefixRelative{get{return“~/api”}}
可以公平地说,“你不应该。”因为这种技术确实有效,所以说“你不能”并不准确。另请参见。如果我想从客户端而不是mvc控制器调用web api?