2012-03-19 6 views
54

편집이 성공하면 최상위 목록 ("인덱스")으로 다시 리디렉션되는 내 컨트롤러에 기본 편집 메서드가 있습니다. MVC 스캐 폴딩 후의 표준 동작.C# ASP.NET MVC 이전 페이지로 돌아 가기

이 편집 방법을 변경하여 인덱스가 아닌 이전 페이지로 리디렉션하려고합니다. 내 Edit 메소드가 기본 매핑 된 입력 매개 변수 "id"를 사용하지 않았으므로, 먼저이를 사용하여 이전 URL을 전달하려고 시도했습니다. 내 편집 "GET"방법에서

, 나는 이전 URL을 잡기 위해 줄을 사용하고 괜찮 았는데 :

ViewBag.ReturnUrl = Request.UrlReferrer; 

그때 나는 내 양식을 사용하여 편집 "포스트"방법이 반환 URL을 전송 태그는 다음과 같습니다.

@using (Html.BeginForm(new { id = ViewBag.ReturnUrl })) 

이제 바퀴가 떨어졌습니다. id 매개 변수에서 올바르게 구문 분석 된 URL을 가져올 수 없습니다.

이 *** UPDATE : 가이드로 게리의 예를 사용 ** *

해결, 나는 "ID"에서 "returnUrl"에서 내 매개 변수를 변경하고 숨김을 사용 필드를 사용하여 양식 태그 대신에 매개 변수를 전달하십시오. 교훈 : "id"매개 변수를 어떻게 사용했는지 간단하게 유지하십시오. 이제 작동합니다. 메모가있는 업데이트 된 코드는 다음과 같습니다.

먼저, 처음으로 수행 한 것처럼 Request.UrlReferrer를 사용하여 이전 URL을 가져옵니다.

// 
    // GET: /Question/Edit/5 

    public ActionResult Edit(int id) 
    { 
     Question question = db.Questions.Find(id); 
     ViewBag.DomainId = new SelectList(db.Domains, "DomainId", "Name", question.DomainId); 
     ViewBag.Answers = db.Questions 
          .AsEnumerable() 
          .Select(d => new SelectListItem 
          { 
           Text = d.Text, 
           Value = d.QuestionId.ToString(), 
           Selected = question.QuestionId == d.QuestionId 
          }); 
     // Grab the previous URL and add it to the Model using ViewData or ViewBag 
     ViewBag.returnUrl = Request.UrlReferrer; 
     ViewBag.ExamId = db.Domains.Find(question.DomainId).ExamId; 
     ViewBag.IndexByQuestion = string.Format("IndexByQuestion/{0}", question.QuestionId); 
     return View(question); 
    } 

및 I 해주기 형태 숨겨진 필드를 사용하여 [HttpPost]에있어서의 모델로부터 returnUrl 파라미터 합격 : 우리로부터 파라미터를 끌어 [HttpPost] 방법에서

@using (Html.BeginForm()) 
{ 
    <input type="hidden" name="returnUrl" value="@ViewBag.returnUrl" /> 
    ... 

숨겨진 필드는 (만약 내가 잘못 나 수정하시기 바랍니다) 당신은 편집이 실패 할 경우 편집 페이지를 다시 표시하고 사용하는이 작업을 수행 할 것인지 .... 여기에 내가 가정입니다

// 
    // POST: /Question/Edit/5 

    [HttpPost] 
    public ActionResult Edit(Question question, string returnUrl) // Add parameter 
    { 
     int ExamId = db.Domains.Find(question.DomainId).ExamId; 
     if (ModelState.IsValid) 
     { 
      db.Entry(question).State = EntityState.Modified; 
      db.SaveChanges(); 
      //return RedirectToAction("Index"); 
      return Redirect(returnUrl); 
     } 
     ViewBag.DomainId = new SelectList(db.Domains, "DomainId", "Name", question.DomainId); 
     return View(question); 
    } 
+1

'id'를 사용하지 않더라도 URL을 전달하는 데 사용하지 않겠습니다. 그건 해킹처럼 보이고, 더 좋은 방법이있을 것이라고 확신합니다. –

+0

예, 정확합니다. 나는 못생긴 해킹을 사용했다. 이것은 내 첫 번째 MVC 응용 프로그램입니다. 나는 많은 것을 시도하고 많은 포스트를 읽고 해킹은 최선의 시도였다. 나는 게리의 예를 기반으로 그것을 고쳤다. 고마워, –

답변

44

리디렉션 리디렉션.

사용자를 리디렉션하지 않고 다시보기를 반환하면 ModelState를 사용하여 오류를 출력 할 수 있습니다.

편집 :

은 피드백을 기반으로 업데이트되었습니다. 이전 URL을 viewModel에 배치하고 숨겨진 필드에 추가 한 다음 편집 내용을 저장하는 액션에서 다시 사용할 수 있습니다.

예를 들어

:

@model ViewModel 

@using (Html.BeginForm()) 
{ 
    ... 
    <input type="hidden" name="PreviousUrl" value="@Model.PreviousUrl" /> 
} 

로 돌아 간다 :

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

[HttpGet] // This isn't required 
public ActionResult Edit(int id) 
{ 
    // load object and return in view 
    ViewModel viewModel = Load(id); 

    // get the previous url and store it with view model 
    viewModel.PreviousUrl = System.Web.HttpContext.Current.Request.UrlReferrer; 

    return View(viewModel); 
} 

[HttpPost] 
public ActionResult Edit(ViewModel viewModel) 
{ 
    // Attempt to save the posted object if it works, return index if not return the Edit view again 

    bool success = Save(viewModel); 
    if (success) 
    { 
     return RedirectToAction(viewModel.PreviousUrl); 
    } 
    else 
    { 
     ModelState.AddModelError("There was an error"); 
     return View(viewModel); 
    } 
} 

중이 반환 URL을 사용하지 않는보기의 BeginForm 방법, 당신은 멀리 얻을 수 있어야합니다 잘못된 URL에 양식 작업을 게시하는 경우 이는 'id'매개 변수로 URL을 전달하기 때문입니다. 따라서 라우팅은 자동으로 경로를 반환 경로로 지정합니다.

양식을 편집 작업을 저장하는 방법을 알 수없는 컨트롤러 작업에 게시하기 때문에이 작업을 수행 할 수 없습니다. 저장 작업에 먼저 게시 한 다음 리디렉션을 처리해야합니다.

+2

+1. 내가 할 수 있다면 더. – Fenton

+0

예, 편집이 성공하면 이전 페이지로 다시 리디렉션해야합니다. 내가 "이드"를 사용했기 때문에 그것이 작동하지 않는다고 생각합니다. 아래에 표시된 것처럼 매개 변수를 "url"로 변경했는데 첫 시도에서 효과가있는 것처럼 보였지만 더 테스트해야합니다. 보유하고 게시 할 것입니다. 나는이 사이트에 게시하고 익숙해지기 위해 틱을하는 것에 익숙하지 않다. –

+0

그런 경우 편집 페이지를 처음로드 할 때 이전 URL을 ViewBag에 배치 한 다음 숨겨진 필드에 배치 할 수 있습니다. 그런 다음 게시 작업에서 ViewModel의 일부로 액세스하여이를 리디렉션 할 수 있습니다. 나는 이것을 querystring을 통해 보내는 것보다 더 좋아할 것입니다. 예를 들면 알려주세요. –

관련 문제