2012-03-12 7 views
11

나는이처럼 보이는 액션 메소드가 액션 메소드에서 쿼리 문자열을 제거ASP.NET MVC는

www.mysite.com/controller/?message=Hello%20world 
:

public ActionResult Index(string message) 
{ 
    if (message != null) 
    { 
    ViewBag.Message = message; 
    } 
    return View(); 
} 

무슨 일이에 요청의 URL이 어떻게 것입니다

그러나 나는 그것이 actionmethod 내부의 쿼리 문자열을 제거 할 수있는 방법이 바로

www.mysite.com/controller/ 

있습니까보고 싶지?

+0

querystring을 입력하지 않을 때 기본 메시지를 원한다고 말하고 있습니까? 또는 처음에 URL로 보낸 메시지의 유형에 관계없이 쿼리 문자열을 숨기고 싶습니까? –

+0

두 번째 것은 기본적으로 메시지를 처리하고 (아무 것도 될 수 있음) URL에 표시하지 않겠습니다. – willvv

답변

15

아니요, POST 메소드를 사용하지 않으면 정보가 어떻게 든 전달되어야합니다. 대안은 중간 클래스를 사용하는 것일 수 있습니다.

// this would work if you went to controller/SetMessage?message=hello%20world 

public ActionResult SetMessage(string message) 
{ 
    ViewBag.Message = message ?? ""; 
    return RedirectToAction("Index"); 
} 

public ActionResult Index() 
{ 
    ViewBag.Message = TempData["message"] != null ? TempData["message"] : ""; 
    return View(); 
} 

또는. 단순히 POST를 사용한 경우

//your view: 
@using(Html.BeginForm()) 
{ 
    @Html.TextBox("message") 
    <input type="submit" value="submit" /> 
} 


[HttpGet] 
public ActionResult Index() 
{ return View(); } 

[HttpPost] 
public ActionResult Index(FormCollection form) 
{ 
    ViewBag.Message = form["message"]; 
    return View(); 
} 
+1

그래, 내 생각. 나는 비슷한 일을 결국 : \t \t \t \t 경우 \t \t \t \t { \t \t \t \t \t TempData [ "메시지"] = 메시지 (메시지 = null이!) \t \t \t \t \t return RedirectToAction ("Index"); \t \t \t \t \t} \t \t \t 경우 (TempData.ContainsKey ("메시지")) \t \t \t \t \t { \t \t \t \t ViewBag.Message = TempData [ "메시지"]; \t \t \t \t \t TempData.Remove ("Message"); \t \t \t \t} 기본적으로 메시지를 저장 한 다음 매개 변수없이 동일한 actionmethod를 다시로드합니다. – willvv

+0

여전히 최상의 솔루션입니까? 특정 시간에만 페이지가 표시되고 모델이 필요하지만이 작업은 공개적으로 액세스 할 수 없으며/등록/AfterHours가 아닌/등록/AfterHours와 같은 예쁜 URL을 원합니다. DateTime ... [ 미친 숯]. 어쨌든, 이것은 효과가 있습니다. –

2

나는 정말로 그렇게 생각하고 있는지 확신하지 못합니다. 쿼리 문자열을 제거하면 ... 쿼리 문자열을 제거합니다. 즉, 페이지에 필요한 쿼리 문자열 값이 없습니다.

할 수있는 여러 가지 해킹이 있습니다. 모두 이상적이지 않습니다. 자바 스크립트를 사용하여 쿼리 문자열을 제거 할 수 있습니다. 세션 변수를 설정 한 후에 쿼리리스 (querystring-less) 페이지로 리디렉션 할 수 있습니다. 모두 꽤 못 생깁니다.

사용자가 주소창에 표시되는 내용은 클라이언트에 있다는 것을 기억하십시오. 클라이언트가이를 제어합니다. 당신은 자바 스크립트를 통해 그것을 바이올린 수 있지만 그렇게하는 것은 일반적으로 나쁜 생각입니다. 사용자로부터 물건을 숨기는 것은 멀웨어와 유사한 행동으로 간주 될 수 있습니다.

1

routes을 살펴보십시오. 매개 변수가있는 URL을 작성하는 방법을 정의합니다.

새 MVC 응용 프로그램을 만들고 'RegisterRoutes()'아래에서 Global.asax.cs 파일을 확인하십시오. 하나의 항목이 표시되어야합니다. 각 부분에서

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "home", action = "index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

봐 :

  • "기본은"이름입니다. 이것은 작성한 각 경로마다 고유해야합니다.
  • "{controller}/{action}/{id}"는 사용하려는 패턴입니다. example.org/home/index?id=2 대신 example.org/home/index/2이 작성됩니다.
  • new {controller = "home", action = "index", id = UrlParameter.Optional}는 아무것도 지정되지 않은 경우 기본값을 정의합니다.

그래서, 그 경로는 당신이 example.org/home/index{id는 선택 사항} 의미 가정합니다 그래서 당신은 example.org에 가면을합니다.

작업을 통해 자신 만의 경로를 만드는 방법을 알아볼 수 있습니다.

는 지금, 당신의 질문을 해결하는 것은 짧은 대답은 당신이 URL가처럼 보이게하지만, 정말 하지예입니다. 기본 메시지가있는 경로를 정의해야하며, 누군가가 메시지를 지정하지 않은 경우에만 표시됩니다. 컨트롤러에 메시지가 무엇인지 알려줘야합니다. 죄송 합니다만 최선을 다해 줄 수있는 경로는

/message/Hello%20World이며 문자열을 사용하는 것이 좋습니다.`/ message/hello_world '를 더 멋지게 바꾸십시오.

+0

그는 친숙한 매개 변수를 추가하려하지 않고 어떻게 든 쿼리 문자열 값을 원하지만 URL에 전혀 표시하지 않습니다. –

+0

당신이 내 대답을 읽으면 나는 그 주소를 보게 될 것입니다. – Joe

0

나는 슬러그를 사용하는 것이 좋습니다. 이 게시물을 확인하십시오 : SOF Slug post 이전 응용 프로그램에서는 URL에서 쿼리 문자열을 제거하기 위해이 방법을 사용했습니다.