我可以从 MVC控制器操作(而不是从视图页面)调用javascript函数并获取返回值吗?怎么样?
我需要使用javascript(例如,但这是aspx页面)向代码(.cs)的服务器发出请求
function getInitData() {
var code; code = 'return {' ;
code += 'me: API.getProfiles({uids: API.getVariable({key: 1280}), fields: "photo"})[0]';
code += '};'
VK.Api.call('execute', { 'code': code }, onGetInitData);
}
答案 0 :(得分:14)
对于刚刚使用标准表单提交(非AJAX)的人,可以在完成操作后触发一些Javascript / JQuery代码。
首先,在Model上创建一个字符串属性。
public class MyModel
{
public string JavascriptToRun { get; set;}
}
现在,在视图的Javascript中绑定到您的新模型属性:
<script type="text/javascript">
@Model.JavascriptToRun
</script>
现在,在您的视图中,创建一个Javascript函数,它可以执行您需要执行的操作:
<script type="text/javascript">
@Model.JavascriptToRun
function ShowErrorPopup() {
alert('Sorry, we could not process your order.');
}
</script>
最后,在你的控制器动作中,你需要调用这个新的Javascript函数:
[HttpPost]
public ActionResult PurchaseCart(MyModel model)
{
// Do something useful
...
if (success == false)
{
model.JavascriptToRun= "ShowErrorPopup()";
return View(model);
}
else
return RedirectToAction("Success");
}
答案 1 :(得分:12)
您可以从JavaScript函数调用控制器操作,但反之亦然。服务器如何知道要定位的客户端?服务器只响应请求。
在发送给客户端的响应中从JavaScript调用控制器操作(使用jQuery JavaScript库)的示例。
$.ajax({
type: "POST",
url: "/Controller/Action", // the URL of the controller action method
data: null, // optional data
success: function(result) {
// do something with result
},
error : function(req, status, error) {
// do something with error
}
});
答案 2 :(得分:10)
是的,绝对可以使用Javascript Result:
return JavaScript("Callback()");
您的观点应引用Javascript:
function Callback(){
// do something where you can call an action method in controller to pass some data via AJAX() request
}
答案 3 :(得分:2)
这是迟到的答案,但对其他人有用。 在视图中使用ViewBag如下:
@Html.Raw("<script>" + ViewBag.DynamicScripts + "</script>")
然后从控制器设置此ViewBag如下:
ViewBag.DynamicScripts = "javascriptFun()";
这将执行JavaScript函数。 但是如果它是ajax调用,则不会执行此函数。 要从ajax回调中调用JavaScript函数,从控制器返回两个值,并在ajax回调中写入成功函数,如下所示:
$.ajax({
type: "POST",
url: "/Controller/Action", // the URL of the controller action method
data: null, // optional data
success: function(result) {
// do something with result
},
success: function(result, para) {
if(para == 'something'){
//run JavaScript function
}
},
error : function(req, status, error) {
// do something with error
}
});
从控制器您可以返回两个值,如下所示:
return Json(new { json = jr.Data, value2 = "value2" });
答案 4 :(得分:1)
您可以通过让控制器返回一段数据来模仿这一点,然后您的视图可以转换为JavaScript调用。
我们这样做是为了让人们使用RESTful URL来共享他们的jquery渲染工作区视图。
在我们的例子中,我们传递一个需要渲染的组件列表,并使用Razor将它们转换回jquery调用。
答案 5 :(得分:1)
如果我正确理解了这个问题,您希望在控制器中使用JavaScript代码。 (你的问题很清楚,但投票和接受的答案都引起了一些疑问)
所以:你可以通过使用.NET的System.Windows.Forms.WebBrowser
控件执行javascript代码,以及浏览器可以执行的所有操作。它需要引用System.Windows.Forms,并且交互在某种程度上是旧学校#34;。 E.g:
void webBrowser1_DocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
HtmlElement search = webBrowser1.Document.GetElementById("searchInput");
if(search != null)
{
search.SetAttribute("value", "Superman");
foreach(HtmlElement ele in search.Parent.Children)
{
if (ele.TagName.ToLower() == "input" && ele.Name.ToLower() == "go")
{
ele.InvokeMember("click");
break;
}
}
}
}
现在可能,这不是最简单的解决方案。
另一种选择是使用Javascript .NET或jint根据具体情况运行javasctipt或其他解决方案。
有关此主题的一些相关问题或可能的重复:
Embedding JavaScript engine into .NET
Load a DOM and Execute javascript, server side, with .Net
希望这有帮助。
答案 6 :(得分:0)
MVC中的常用/标准方式是你应该在视图中放置/调用你的所有显示,UI,CSS和Javascript,但是没有规则,你可以在Controller中调用它如果你设法这样做(我没有看到可能性)。
答案 7 :(得分:0)
由于您的控制器操作在服务器上执行,并且JavaScript(通常)在客户端(浏览器)上执行,因此这没有意义。如果在页面加载到浏览器后默认情况下需要执行某些操作,则可以使用JavaScript的document.OnLoad事件处理程序。
答案 8 :(得分:0)
<script>
$(document).ready(function () {
var msg = '@ViewBag.ErrorMessage'
if (msg.length > 0)
OnFailure('Register', msg);
});
function OnSuccess(header,Message) {
$("#Message_Header").text(header);
$("#Message_Text").text(Message);
$('#MessageDialog').modal('show');
}
function OnFailure(header,error)
{
$("#Message_Header").text(header);
$("#Message_Text").text(error);
$('#MessageDialog').modal('show');
}
</script>