2012-03-29 64 views
4

我需要得到的字符串數組或列表使用Ajax和行動,這是我的執行情況:使用Ajax和JsonResult在ASP.NET MVC 3

這是視圖索引行動我HTML DOM中AccessMenuController:

<div class="RoleAccess"> 
    <select name="RoleDropDown"> 
    <option value="0">Select Role</option> 
    <option value="61AD3FD9-C080-4BB1-8012-2A25309B0AAF">AdminRole</option> 
    <option value="8A330699-57E1-4FDB-8C8E-99FFDE299AC5">Role2</option> 
    <option value="004E39C2-4FFC-4353-A06E-30AC887619EF">Role3</option> 
    </select> 
</div> 

我的控制器:

namespace MyProject.Areas.GlobalAccess.Controllers { 

public class AccessMenuController : Controller { 

    public ActionResult Index() { return View();} 

    [HttpPost] 
    public JsonResult RoleDropDownChanged(string roleId) { 

    Guid RoleId = new Guid(roleId); 

    //Some implement 

    List<string> actions = new List<string>(); 
    for(int i = 0; i <= 10; i++) 
      actions.Add(i.ToString()); 

return Json(actions.ToArray(), JsonRequestBehavior.AllowGet); 

    } 
    } 
} 

和腳本:

$(document).ready(function() { 

//Handle Checks of Actions by RoleName Changed 
$('div.RoleAccess select').change(function() { 
    RoleChangeHandler(); 
}); 

function RoleChangeHandler() { 

    $.ajax({ 
     url: '@Url.Action("RoleDropDownChanged")', 
     type: 'POST', 
     data: { 'roleId': '61AD3FD9-C080-4BB1-8012-2A25309B0AAF' }, 
     dataType: 'json', 
     processData: false, 
     contentType: 'application/json; charset=utf-8', 
     success: function (data) { SuccessRoleChangeHandler(data); }, 
     error: OnFailRoleChangeHandler 
    }); 
    return false; 
} 


function SuccessRoleChangeHandler(data) { 

    alert("in success role change"); 

} 

function OnFailRoleChangeHandler(result) { 
    alert('in OnFailRoleChangeHandler'); 

} 

而問題是所有更改下拉只是Onfail函數運行並警惕我「在OnFailRoleChangeHandler」,我也檢查RoleDropDownChanged行動與斷點,永遠不會運行,問題在哪裏?

UPDATE

,當我通過Chrome瀏覽器加載頁面有控制檯窗口中的錯誤: http://MyProject/GlobalAccess/AccessMenu/@Url.Action(%22RoleDropDownChanged%22) 404 (Not Found) jquery-1.7.1.js:8102

+0

當您調試時,您的服務器方法是否會引發異常?你有沒有嘗試調試JavaScript代碼? – Kosta 2012-03-29 08:35:09

+0

如果您擁有這個'@ Url.Action(%22RoleDropDownChanged%22)',那麼您的腳本不會被Razor Engine解析。如果你可以的話,你可以把腳本放在剃刀視圖裏,而不是放在一個單獨的.js文件中。 – Silvermind 2012-03-29 08:42:42

+0

@Kosta I更新問題 – Saeid 2012-03-29 08:43:07

回答

6

刪除此設置:

contentType: 'application/json; charset=utf-8', 

您還沒有發送任何JSON來服務器。

如果你想保留此設置然後確保你發送一個有效的JSON到您的服務器:

data: JSON.stringify({ 'roleId': '61AD3FD9-C080-4BB1-8012-2A25309B0AAF' }) 

所以:

$.ajax({ 
    url: '@Url.Action("RoleDropDownChanged")', 
    type: 'POST', 
    data: { 'roleId': '61AD3FD9-C080-4BB1-8012-2A25309B0AAF' }, 
    success: SuccessRoleChangeHandler, 
    error: OnFailRoleChangeHandler 
}); 

應該工作(至少它爲我)具有以下作用:

[HttpPost] 
public ActionResult RoleDropDownChanged(Guid roleId) 
{ 
    var actions = Enumerable.Range(1, 10).Select(x => x.ToString()).ToList(); 
    return Json(actions); 
} 

更新:

根據您的意見,它看起來像你試圖在單獨的JavaScript中使用服務器端助手,這是不可能的。這是我會建議你的。

<div class="RoleAccess"> 
    @Html.DropDownListFor(
     x => x.RoleDropDown, 
     Model.Roles, 
     "-- Select role --", 
     new { 
      data_url = Url.Action("RoleDropDownChanged") 
     } 
    ) 
</div> 

,然後在單獨的JavaScript文件:通過生成的下拉菜單時,提供的URL啓動

$(document).ready(function() { 
    $('div.RoleAccess select').change(function() { 
     var url = $(this).data('url'); 
     $.ajax({ 
      url: url, 
      type: 'POST', 
      data: { 'roleId': '61AD3FD9-C080-4BB1-8012-2A25309B0AAF' }, 
      success: function(result) { 
       alert('success'); 
      }, 
      error: function() { 
       alert('error'); 
      } 
     });   
    });  
}); 

然後當然,你可以替換當前選擇的值硬編碼的角色ID:

data: { 'roleId': $(this).val() } 
+0

我嘗試了兩條建議,但也存在同樣的問題。 – Saeid 2012-03-29 08:21:48

+0

嘗試刪除'processData:false'。你也看到你的JavaScript調試器中的任何錯誤?服務器對AJAX請求的確切響應是什麼? – 2012-03-29 08:24:00

+0

我這樣做,沒有工作,同樣的問題。 – Saeid 2012-03-29 08:27:40

1

如果腳本駐留在.JS文件中,那麼這將不起作用,因爲它將被視爲純文本。您可以將整個腳本移動到視圖中,也可以對腳本進行重新分解,以便大部分腳本保留在.JS中,然後從視圖中傳遞相關值。

2

移動你的$(document).ready功能,您的瀏覽這樣的:

<script type="text/javascript"> 
$(document).ready(function() { 

    //Handle Checks of Actions by RoleName Changed 
    $('div.RoleAccess select').change(function() { 
     RoleChangeHandler('@Url.Action("RoleDropDownChanged")'); 
    }); 
}); 
</script> 

然後在您的JS文件的URL參數添加到您的功能和變化Ajax調用:

function RoleChangeHandler(pageUrl) { 

    $.ajax({ 
     url: pageUrl, 
     type: 'POST', 
     data: { 'roleId': '61AD3FD9-C080-4BB1-8012-2A25309B0AAF' }, 
     dataType: 'json', 
     processData: false, 
     contentType: 'application/json; charset=utf-8', 
     success: function (data) { SuccessRoleChangeHandler(data); }, 
     error: OnFailRoleChangeHandler 
    }); 
    return false; 
} 

如你預期這應該工作。

+0

謝謝,這對我有用。 – Sunil 2012-04-12 09:54:07