2017-12-21 31 views
-1

私はMVCを初めて使用しています。ここで私のビューで何をやっているの要点です:Asp.Net Core 2.0投稿後にRedirectToActionが機能しない

割り当てられたユーザーロールでIDユーザーを表示します。

ページのクローンユーザロール部分:

は、エンドユーザが他のいくつかの識別ユーザを選択することができますSelectListのを持っています。

選択したユーザーの現在のユーザーロールを表示します。これは部分ビューで機能します。

クローンユーザーボタンをクリックし、現在表示されているユーザーのすべてのユーザーロールを削除してから、 SelectListから割り当てられたユーザーが選択したすべてのロールに追加します。

私はViewを1つの例外を除いて望むように働かせています。ユーザーのアイデンティティロールを変更した後、Viewの一部が更新されず、新しいロールが表示されます。私のViewModelではUserRolesになります。更新するためにCtrl + F5を押すと、最新のロールが表示されます。以下、私が持っている私の見解で私のスクリプトで、その後

<a id="uxCloneUserButton" class="hidden"> 
    <i class="glyphicon glyphicon-duplicate"></i> &nbsp;Clone User 
</a> 

そして:

$('#uxCloneUserButton').click(function() { 
    var selectedId = $('#uxEmployeeSelect').val(); 
    var appUserId = $('#uxHiddenAppUserId').val(); 
    var url = '@Url.Action("CloneUser", "ApplicationUser")'; 

    //post id and username to controller action 
    $.post(url, { id: appUserId, cloneUserId: selectedId }, function (data) { 
    }); 
}); 

public ApplicationUser AppUser { get; set; } 
public TblEmployee Employee { get; set; } 
[Display(Name = "User Roles")] 
public List<Tuple<string, string>> UserRoles { get; set; } 
[Display(Name = "Available Roles")] 
public List<Tuple<string, string>> AllRoles { get; set; } 
[Display(Name = "Select Employee")] 
public List<SelectListItem> EmployeeList { get; set; } 

私は自分のページ上のリンクを持っている:ここでは

は私のViewModelです

私は適切なパラメータで私のコントローラ上のアクションに到達し、正常に動作しています。私のコントローラでは、私はこれを持っています:

[HttpPost] 
public async Task<IActionResult> CloneUser(string id, string cloneUserId) 
{ 
    ApplicationUser currentUser = await _userManager.FindByIdAsync(id); 
    ApplicationUser cloneUser = await _userManager.FindByIdAsync(cloneUserId); 
    //Remove currentUser from all current roles 
    var currentUserRoles = await _userManager.GetRolesAsync(currentUser); 
    if (currentUserRoles.Count > 0) 
     await _userManager.RemoveFromRolesAsync(currentUser, currentUserRoles.ToArray()); 
    var cloneUserRoles = await _userManager.GetRolesAsync(cloneUser); 
    if (cloneUserRoles.Count > 0) 
     await _userManager.AddToRolesAsync(currentUser, cloneUserRoles.ToArray());    
    return RedirectToAction(nameof(Details), new { id = id });    
} 

あなたの助けに感謝します。私はちょうどクリックの後に更新するためにページのこの部分を必要とし、私はすべて設定されています。

UPDATEは、私はそれを動作させることができましたが、私の解決策は良いもののように感じることはありません。

私は自分のViewModelに文字列を追加しました:

public string JSRedirectLocation { get; set; } 

を私は私のVMのプロパティのすべて割り当てる私の詳細アクションでプロパティを設定:私は後にリダイレクトするために、私はJavaScriptを変え

//Redirect location 
model.JSRedirectLocation = "/ApplicationUser/Details/" + model.AppUser.Id; 

を投稿:

//post id and username to controller action 
$.post(url, { id: appUserId, cloneUserId: selectedId }, function (data) { 
    window.location = '@Model.JSRedirectLocation'; 
}); 

私はこれをいくつかのクリーンな方法、嘆願セ?この解決法は私にとっては冗長であり、回避策のように思えます。ありがとう。

+0

ルックpartialview – DaniDev

+0

を返すにあなたがアヤックスから投稿され、期待通りに動作しませんサーバーからリダイレクトします。あなたがやったやり方は、応答を受け取った後にリダイレクトすることです。 – Fals

+0

アヤックスの全ポイントは、**同じ**ページにとどまることです。 Ajaxコールはリダイレクトされません。リダイレクトする場合は、ajaxを使用しないでください! –

答えて

1

あなたのリクエストはajaxコールです。このためにはjsonを返してからターゲットへの応答リダイレクトを処理する必要があります。次のコード

[HttpPost] 
public async Task<IActionResult> CloneUser(string id, string cloneUserId) 
{ 
    //.. your code 

    var redirectUrl = Url.Action(nameof(Details), new { id = id }); 

    return Json(new { 
     redirectUrl = redirectUrl 
    }); 
} 

とAJAX呼び出しを使用して::だからアクション使用中

$.post(url, { id: appUserId, cloneUserId: selectedId }, function (data) { 
    window.location = data.redirectUrl; 
}); 
+0

私のコードをあなたの例で整理しました。とても明快で簡潔でありがとうございます。多くのありがとう、モハマド。 – user1778158

+0

それは私の喜びです、幸運です –

関連する問題