C # ASP.NET MVC 이전 페이지로 돌아 가기
편집이 성공하면 컨트롤러에 최상위 목록 ( "인덱스")으로 다시 리디렉션되는 기본 편집 메서드가 있습니다. MVC 스캐 폴딩 후 표준 동작.
이 편집 방법을 변경하여 색인이 아닌 이전 페이지로 다시 리디렉션하려고합니다. 내 Edit 메서드는 기본 매핑 된 입력 매개 변수 "id"를 사용하지 않았기 때문에 먼저이를 사용하여 이전 URL을 전달하려고했습니다.
내 Edit "get"메서드에서이 줄을 사용하여 이전 URL을 가져 왔고 제대로 작동했습니다.
ViewBag.ReturnUrl = Request.UrlReferrer;
그런 다음 다음과 같은 양식 태그를 사용하여이 반환 URL을 Edit“post”메서드로 보냈습니다.
@using (Html.BeginForm(new { id = ViewBag.ReturnUrl }))
이제 이것은 바퀴가 떨어진 곳입니다. id 매개 변수에서 제대로 구문 분석 된 URL을 가져올 수 없습니다.
*** 업데이트 : 해결됨 ** *
Garry의 예제를 가이드로 사용하여 매개 변수를 "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);
}
이제 다음과 같은 형식의 숨겨진 필드를 사용하여 모델의 returnUrl 매개 변수를 [HttpPost] 메서드로 전달합니다.
@using (Html.BeginForm())
{
<input type="hidden" name="returnUrl" value="@ViewBag.returnUrl" />
...
[HttpPost] 메서드에서 숨겨진 필드에서 매개 변수를 가져 와서 리디렉션합니다 ....
//
// 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);
}
편집이 실패 할 경우 편집 페이지를 다시 표시하고 싶다고 가정하고 있습니다 (잘못된 경우 수정 해주십시오). 이렇게하려면 리디렉션을 사용하고 있습니다.
사용자를 리디렉션하는 대신 뷰를 다시 반환하는 것만으로도 운이 더 좋을 수 있습니다. 이렇게하면 ModelState를 사용하여 오류를 출력 할 수도 있습니다.
편집하다:
피드백을 기반으로 업데이트되었습니다. 이전 URL을 viewModel에 배치하고 숨겨진 필드에 추가 한 다음 편집 내용을 저장하는 작업에서 다시 사용할 수 있습니다.
예를 들면 :
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 Redirect(viewModel.PreviousUrl);
}
else
{
ModelState.AddModelError("There was an error");
return View(viewModel);
}
}
뷰에 대한 BeginForm 메서드는이 반환 URL을 사용할 필요가 없습니다. 다음과 같이 처리 할 수 있습니다.
@model ViewModel
@using (Html.BeginForm())
{
...
<input type="hidden" name="PreviousUrl" value="@Model.PreviousUrl" />
}
잘못된 URL에 게시하는 양식 작업으로 돌아 가면 URL을 'id'매개 변수로 전달하기 때문에 라우팅이 반환 경로를 사용하여 URL의 형식을 자동으로 지정하기 때문입니다.
양식이 편집 내용을 저장하는 방법을 모르는 컨트롤러 작업에 게시되기 때문에 작동하지 않습니다. 먼저 저장 작업에 게시 한 다음 그 안에서 리디렉션을 처리해야합니다.
Here is just another option you couold apply for ASP NET MVC.
Normally you shoud use BaseController
class for each Controller
class.
So inside of it's constructor method do following.
public class BaseController : Controller
{
public BaseController()
{
// get the previous url and store it with view model
ViewBag.PreviousUrl = System.Web.HttpContext.Current.Request.UrlReferrer;
}
}
And now in ANY view you can do like
<button class="btn btn-success mr-auto" onclick=" window.location.href = '@ViewBag.PreviousUrl'; " style="width:2.5em;"><i class="fa fa-angle-left"></i></button>
Enjoy!
참고URL : https://stackoverflow.com/questions/9772947/c-sharp-asp-net-mvc-return-to-previous-page
'programing tip' 카테고리의 다른 글
RDP 클라이언트가 데스크톱이 아닌 원격 애플리케이션을 시작할 수 있습니까? (0) | 2020.11.22 |
---|---|
두 개의 TextView가 나란히 있고 하나만 타원 크기입니까? (0) | 2020.11.22 |
문 복사 값을 반환합니까? (0) | 2020.11.22 |
Angular 2-하위 모듈 라우팅 및 중첩 (0) | 2020.11.22 |
대부분의 STL 구현의 코드가 왜 그렇게 복잡합니까? (0) | 2020.11.22 |