2017-12-21 5 views
-1

MVC를 처음 사용합니다. 다음은 내보기에서 수행중인 작업의 요점입니다.Asp.Net Core 2.0 게시 후 RedirectToAction이 작동하지 않습니다.

할당 된 사용자 역할로 ID 사용자 표시. 페이지의

복제 사용자 역할 부분 :

는 최종 사용자가 다른 신원 사용자를 선택할 수 selectList의 되세요.

선택한 사용자의 현재 사용자 역할 표시 -이 부분보기에서 작업하고 있습니다.

사용자 복제 버튼을 클릭하고 현재 표시된 사용자에 대한 모든 사용자 역할을 제거한 다음 SelectList에서 선택된 사용자가 선택한 모든 역할에 추가합니다.

사용자보기 역할을 변경 한 후 (예 : 사용자 복제 링크를 클릭하여)보기의 일부가 새로 고쳐지지 않아 새 역할이 표시되지 않습니다. 내 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; } 

나는 내 페이지에 링크가 : 여기

내 뷰 모델입니다

적절한 매개 변수를 사용하여 컨트롤러에서 동작을 얻었으므로 정상적으로 작동합니다. 제 컨트롤러에서 저는 이것을 가지고 있습니다 :

[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 나는이 작업을 얻을 수 있었다,하지만 내 솔루션은 좋은 느낌하지 않습니다.

나는 나의 뷰 모델에 문자열을 추가 :
//Redirect location 
model.JSRedirectLocation = "/ApplicationUser/Details/" + model.AppUser.Id; 

난 후 리디렉션 내 자바 스크립트를 변경 : 내가 내 VM의 모든 속성을 할당 내 세부 작업의 속성을 설정
public string JSRedirectLocation { get; set; } 

게시물 :

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

누군가 내가 이걸 좀 더 깨끗한 방법으로해야하는지 말해 줄 수 있습니까? 그렇지? 이 솔루션은 내가보기에 불필요한 것으로 보입니다. 감사.

+0

봐 partialview – DaniDev

+0

반환에 당신은 아약스에서 게시하는, 예상대로 작동하지 않습니다 서버로 리디렉션합니다. 응답을받은 후 리디렉션하는 방식은 Ok입니다. – 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 
    }); 
} 

와 아약스 전화 사용 : 그래서 액션 사용

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

예제를 사용하여 코드를 정리했는데 효과가있었습니다. 너무 명확하고 간결 해 주셔서 감사합니다. 많은 감사, 모하마드. – user1778158

+0

내 행운을 빈다. –

관련 문제