[英]Call javascript from MVC controller action
我可以從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);
}
對於剛剛使用標准表單提交(非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");
}
您可以從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結果肯定是可能的:
return JavaScript("Callback()");
您的視圖應引用Javascript:
function Callback(){
// do something where you can call an action method in controller to pass some data via AJAX() request
}
這是遲到的答案,但對其他人有用。 在視圖中使用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" });
如果我正確理解了這個問題,您希望在Controller中使用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,或者根據具體情況運行其他解決方案。
關於這個主題的一些相關問題或可能的重復:
希望這可以幫助。
您可以通過讓控制器返回一段數據來模仿這種方法,然后您的視圖可以轉換為JavaScript調用。
我們這樣做是為了讓人們使用RESTful URL來共享他們的jquery渲染工作區視圖。
在我們的例子中,我們傳遞一個需要渲染的組件列表,並使用Razor將這些組件轉換回jquery調用。
MVC中的通常/標准方式是你應該在View中調用/調用你的所有顯示,UI,CSS和Javascript,但是沒有規則, 如果你設法這樣做 ,你也可以在Controller中調用它(我看不到的可能性)。
由於您的控制器操作在服務器上執行,並且JavaScript(通常)在客戶端(瀏覽器)上執行,因此這沒有意義。 如果在頁面加載到瀏覽器后默認情況下需要執行某些操作,則可以使用JavaScript的document.OnLoad事件處理程序。
<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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.