从 MVC 控制器操作调用 javascript
Posted
技术标签:
【中文标题】从 MVC 控制器操作调用 javascript【英文标题】:Call javascript from MVC controller action 【发布时间】:2011-02-12 04:34:56 【问题描述】:我可以从 MVC 控制器操作(不是从视图页面)调用 javascript 函数并获取返回值吗?怎么样?
我需要像这里一样使用 javascript 从代码 (.cs) 向服务器发出请求(但这是 aspx 页面)
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);
【问题讨论】:
这完全不可能。 【参考方案1】:在 MVC 中通常/标准的方式是你应该在 View 中放置/调用所有显示、UI、CSS 和 Javascript,但是没有规则,你也可以在 Controller 中调用它如果你设法做到了(我认为不可能)。
【讨论】:
【参考方案2】:您可以从 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
);
【讨论】:
我需要使用 javascript 从代码向服务器发出请求,如下所示:function getInitData() var code;代码='返回';代码+='我:API.getProfiles(uids:API.getVariable(key:1280),字段:“照片”)[0]';代码 += ';'; VK.Api.call('execute', 'code': code , onGetInitData); 嗨 Russ,我在 20 个项目的列表下有大量的命令按钮(绑定到相同的操作)。因此,我试图减少命令按钮的数量。我正在寻找通过 javascript 在控制器类中调用操作方法的方法,只是遇到了这个问题。我是否应该使用您给定的技术通过调用动作方法来减少状态,尽管像这样从 JS 而不是多个 commandButtons 方法?谢谢! @Marcos - 我不确定我是否完全理解您的问题 - 我建议您打开一个包含详细信息的新问题,看看 *** 社区如何提供帮助 谢谢。已经这样做了***.com/questions/8204545/… SignalR 怎么样?还是一般的长轮询/网络套接字?那不会提供效果吗?【参考方案3】:由于您的控制器操作在服务器上执行,而 JavaScript(通常)在客户端(浏览器)上执行,这没有任何意义。如果您需要在页面加载到浏览器后默认执行一些操作,您可以使用 JavaScript 的 document.OnLoad 事件处理程序。
【讨论】:
【参考方案4】:您可以通过让控制器返回一段数据来模仿这一点,然后您的视图可以将其转换为 JavaScript 调用。
我们这样做是为了允许人们使用 RESTful URL 来共享他们的 jquery 渲染工作区视图。
在我们的例子中,我们传递了一个需要渲染的组件列表,并使用 Razor 将这些组件转换回 jquery 调用。
【讨论】:
【参考方案5】:是的,绝对可以使用 Javascript 结果:
return JavaScript("Callback()");
你的视图应该引用Javascript:
function Callback()
// do something where you can call an action method in controller to pass some data via AJAX() request
【讨论】:
在网页上显示Callback()
。
要使用它,您需要使用 jquery ajax 调用来调用控制器操作。【参考方案6】:
如果我正确理解了这个问题,您希望在控制器中包含 JavaScript 代码。 (您的问题很清楚,但投票和接受的答案引发了一些疑问)
所以:您可以通过使用 .NET 的 System.Windows.Forms.WebBrowser
控件来执行 javascript 代码以及浏览器可以执行的所有操作来执行此操作。虽然它需要参考 System.Windows.Forms,但交互有点“老派”。例如:
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
希望这会有所帮助。
【讨论】:
【参考方案7】:对于那些只使用标准表单提交(非 AJAX)的人,还有另一种方法可以在您的操作完成后触发一些 Javascript/JQuery 代码。
首先,在您的模型上创建一个字符串属性。
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");
【讨论】:
非常好的答案,如果操作成功(例如更新表格),我想显示一个绿色的 toastr 通知,否则返回一个红色的通知,这对我有帮助。【参考方案8】:<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>
【讨论】:
【参考方案9】:这是迟到的答案,但对其他人可能有用。 在视图中使用 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" );
【讨论】:
有效的解决方案。谢谢 我测试了这个解决方案。我不相信 javascriptFun() 可以这样调用。以上是关于从 MVC 控制器操作调用 javascript的主要内容,如果未能解决你的问题,请参考以下文章
从 MVC 控制器动作调用 APIController 动作
c# Azure MVC 从控制器调用 .Result 检查 blob 是不是存在