C# 如何从jQuery调用C静态方法
我看过一些文章,展示了如何使用Microsoft的[WebMethod]从JavaScript调用用于Web表单应用程序的C方法。我想对ASP.NETMVC应用程序也这样做。我有一个C静态方法,返回转换后的数据:C# 如何从jQuery调用C静态方法,c#,jquery,asp.net-mvc,asp.net-web-api,C#,Jquery,Asp.net Mvc,Asp.net Web Api,我看过一些文章,展示了如何使用Microsoft的[WebMethod]从JavaScript调用用于Web表单应用程序的C方法。我想对ASP.NETMVC应用程序也这样做。我有一个C静态方法,返回转换后的数据: public static string Translate(string word) { return langRepo.Translate(word); } 上述函数在服务器端代码中运行良好。但是,我想将相同的代码扩展到客户端。理想情况下,我希望创建如下jQuery函数: f
public static string Translate(string word)
{
return langRepo.Translate(word);
}
上述函数在服务器端代码中运行良好。但是,我想将相同的代码扩展到客户端。理想情况下,我希望创建如下jQuery函数:
function Translate(word) {
//call C# translate method and return result
}
"<hr /><h5>" + Translate(heading) + "</h5>";
然后像这样使用它:
function Translate(word) {
//call C# translate method and return result
}
"<hr /><h5>" + Translate(heading) + "</h5>";
我该怎么做
请执行以下操作:
在服务器端的函数顶部添加[WebMethod]。
来自客户端的调用应类似于以下代码段:
提示:类型应为POST类型。检查完整的示例
function Translate(word){
// Type of data passed should match the function's parameters
var data = {word: word};
$.ajax({
type: "POST",
url: "pageName.aspx/Translate",
data: data,
contentType: "application/json; charset=utf-8",
dataType: "json",
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("Request: " + XMLHttpRequest.toString() + "\n\nStatus: " + textStatus + "\n\nError: " + errorThrown);
},
success: function (response) {
// Here you can assign response to tags.
// If response was empty, try response.d.
$("#id").html(response);
}
});
}
如果您使用的是ASP.NET MVC应用程序,则可以改用[HttpGet],并以JSON格式返回函数操作的结果,因为我们在Ajax请求中指定了数据类型:JSON
以下是一个例子:
[HttpGet]
public ActionResult Translate(String word)
{
var resultWord = ModelInit.repo.TranslateItem(word);
return Json(new {result = resultWord}, JsonRequestBehavior.AllowGet);
}
在Ajax调用的成功处理程序中,通过访问result属性获取值:
success: function (response) {
// Here you can assign response to tags
$("#id").html(response.result);
}
尝试以下方法。首先是返回json的C控制器操作,然后从jQuery方法调用控制器操作
public class LanguageController : Controller
{
[HttpGet]
public JsonResult Translate(string word)
{
var translatedWord = langRepo.Translate(word);
return Json(translatedWord, JsonRequestBehavior.AllowGet);
}
}
jQuery方法:
function Translate(word){
$.ajax({
type: "GET",
url: "/Language/Translate",
data: {word: word},
dataType: "json",
cache: false,
success: function (data) {
if(data.length == 0) {
alert("Cannot translate.");
}
else {
// Get the translated word
var translatedWord = data.translatedWord;
// Update the DOM element (label) with translated word
$("#translatedWord").text(translatedWord);
}
}
});
}
在我多年的编程生涯中,我第一次不得不将AJAX调用更改为synchronous,以使其按我所希望的方式工作。所需要的只是将async:false属性添加到AJAX调用中。通过这种方式,AJAX调用被视为与任何其他同步函数一样:
function Translate(word) {
var Url = "/api/translate/" + word;
var translated;
$.ajax({
type: "GET",
url: Url,
dataType: "json",
cache: false,
async: false,
success: function (response, status, xhr) {
translated = response.translatedWord;
},
error: function (jqXhr, textStatus, errorThrown) {
var error = CapitalizeFirst(textStatus) + ": " + errorThrown + " - " + jqXhr.responseText;
bootbox.alert(error);
}
});
return translated;
}
对于那些想将此作为项目解决方案的人,请三思!使AJAX调用同步并不是一件小事。这样做会迫使用户在程序再次响应之前等待服务器的响应。除非您确定数据集很小且访问频率不高,否则您应该寻找其他方法。我看不到您的截图imgur domain被阻止,而且您也没有发布太多代码,因此我将向您展示一个我是如何做到这一点的示例,稍后我可以更新答案以更好地回答您的问题 我调用了一个存储过程,并使用AJAX将生成的数据插入到我的页面中 首先,我在C中有一个对象,它有一个开始和结束日期。我的模型:
public class DateRange
{
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
}
我的数据访问层DateRepository调用了我的存储过程,但由于它与此问题无关,所以对它进行了一点匿名化:
public static List<DateRange> GetDates(int number)
{
// execute stored procedure, ORM converts the rows to a list of objects
...
return dateRanges;
}
Jsonresult来自System.Web.Http>ApiController>Jsonresult-JsonT内容
现在,我的UI层控制器调用此服务方法:
public async Task<JsonResult> Get_DateRanges(int number)
{
var response = await ServiceClient.HttpGetList<DateRange>([url here calling /Dates/{number} ]);
return new JsonResult { Data = response, MaxJsonLength = Convert.ToInt32(WebConfigurationManager.AppSettings["MaxJsonLength"]), JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}
记住,这个JSONResult是列表的一部分。这就是JSON的数据字段中的内容
最后,调用UI控制器方法的javascript代码:
function updateDateRanges() {
var nNumber = $("input#Number").val();
var params = { number: nNumber };
// note the JSON call is to the UI layer
$.getJSON(ROOT + "UIController/Get_DateRanges", params, function (data) { })
.done(function (data) {
// change model values from server
$("input#StartDate").val(data[0].StartDate);
$("input#EndDate").val(data[0].EndDate);
})
.fail(function () {
errorAlert("Error retrieving dates.");
})
}
请注意,我检索日期(例如数据[0].StartDate)的方式是因为我有一个日期范围对象列表。由于您可以调用单独返回JSON的函数,就像我在浏览器中键入服务层的URL一样,因此应该很容易看到JSON数据的样子
从您的评论来看,您的问题似乎根本不是原始帖子中所述的内容,而是对javascript异步本质的基本理解。考虑下面的例子:
$output.clickfunction{
var inputText=$output.text;
翻译输入文本;
};
函数translateWordword{
getTranslationFromServerword;
}
函数getTranslationFromServerword{
//使用setTimeout模拟2秒的慢速响应,而不是AJAX请求
setTimeoutfunction{
$output.texto en español;
}, 2000;
$output.css'background-color','yellow';
}
英文文本
您需要使用ajax来调用服务器方法我已经尝试过了。如果您没有正确尝试,则无法正常工作:添加ajax代码,我们将能够更正。请将代码、错误和数据添加为文本,而不是图像。图片:A不允许我们复制和粘贴代码/错误/数据进行测试;B不允许基于代码/错误/数据内容进行搜索;和一般来说,文本格式的代码/错误/数据>>>>图像格式的代码/错误/数据>>无。如果图像添加了一些仅由文本代码/错误/数据无法传达的重要信息,则只能在代码格式的文本之外使用图像。不幸的是,这不起作用。您假设我的函数在.aspx页面中。我在这里使用的是MVC No.aspx页面。我创建了一个模拟函数调用的Web API,但即使这样也不适用于我。我的函数在另一个程序集中,我调用App.Services.Helpers:namespace App.Services.Helpers{public static class Utility{public static string capitalize firststring word{//检查空字符串。如果string.IsNullOrEmptyword{return string.empty;}//返回char和concat substring.return char.ToUpperword[0]+word.Substring1;}
[WebMethod]公共静态字符串Translatestring word{return ModelInit.repo.TranslateItemword;}}}}}也许我可以用另一种方法来处理这个问题。。。假设我创建了一个Web API,在这里我可以传递单词,它会像这样为我翻译:/API/translate/title,这个API返回一个字符串:título。我如何获取这个结果并像这样使用它:heading=+translatedWord+;?当您提到web表单应用程序时,您的问题还不够清楚,这就是我写这个答案的原因。如果是MVC应用程序,则无需使用[WebMethod]进行装饰。。相反,用[HttpGet]装饰并在函数内部返回Jsonnew{id=10,title=test};这绝对不是你应该追求的解决方案。我看不到您的屏幕截图,但很明显您在某处做错了什么,因为您不是第一个使用jQuery异步调用方法的人,我今天早些时候确实这么做了。第二,如果你想翻译网页,这可能不是你应该采用的方法。如果你有更好的解决方案,无论如何,请发布它!一定是!!在另一个Ajax调用中有一个Ajax调用。它们在异步执行时都会混淆。内部需要同步。好的。您的解决方案是我所说的传统解决方案,也是我们许多开发人员每天的解决方案。$.getJSON直接将值写入DOM。但正如您从问题中看到的,如果您能看到它,我想知道如何从可以在Javascript中调用的函数中获取AJAX调用的结果作为返回值。通过这种方式,该函数可以变得通用,比如大写第一个字母,并根据需要在任何地方使用,而不仅仅是用于特定的用例。为什么我需要这样?因为在本例中,我是从另一个AJAX函数内部调用它@KeithHarris我的方法超出了泛型——数据被插入到DOM中,因为我正在显示数据。这并没有使任何事情变得不一般。如果您需要从另一个异步函数中调用异步函数,听起来您需要阅读Javascript中回调的工作原理。您的解决方案对我不起作用,因为我不知道在运行时DOM将是什么。事实上,DOM是根据允许用户访问的内容动态构建的。我意识到这是一个不寻常的情况,因为我以前从来没有这样做过,所以我想知道其他开发人员是否也遇到过类似的问题,以及他们是如何解决的。我尝试使用了一个回调函数,也显示在屏幕截图中,你看不到,但它也不起作用。@KeithHarris我用片段回答了你的问题演示等待AJAX调用的正确方法,有望帮助您理解javascript。如果你能帮我一个大忙,那就是把你的实际代码编辑成你的原始问题,因为你复制/粘贴它比我从手机屏幕截图上重新键入要容易得多。如果你想让我实际使用你的代码作为例子,你需要为我发布它。