[c#] 라우팅 : 현재 작업 요청 […]이 다음 작업 방법간에 모호합니다.

Browse.chtml사용자가 검색어를 입력하거나 검색어를 비워 둘 수 있는보기가 있습니다. 검색어를 입력 할 때 페이지를로 연결 http://localhost:62019/Gallery/Browse/{Searchterm} 하고, 아무것도 입력하지 않은 경우 브라우저를로 연결하고 싶습니다 http://localhost:62019/Gallery/Browse/Start/Here.

이것을 시도하면 오류가 발생합니다.

컨트롤러 유형 ‘GalleryController’의 ‘Browse’작업에 대한 현재 요청은 다음 작업 메서드간에 모호합니다. System.Web.Mvc.ActionResult Browse (System.String) on ​​type AutoApp_MVC.Controllers.GalleryController System.Web.Mvc.ActionResult Browse (Int32, System.String) AutoApp_MVC.Controllers.GalleryController 형식

내가 MVC로하는 모든 일은 처음입니다. 이 시점에서 무엇을 시도해야할지 잘 모르겠습니다.

public ActionResult Browse(string id)
{
    var summaries = /* search using id as search term */
    return View(summaries);
}

public ActionResult Browse(string name1, string name2)
{
    var summaries = /* default list when nothing entered */
    return View(summaries);
}

Global.asax.cs에도 다음이 있습니다.

    routes.MapRoute(
         "StartBrowse",
         "Gallery/Browse/{s1}/{s2}",
         new
         {
             controller = "Gallery",
             action = "Browse",
             s1 = UrlParameter.Optional,
             s2 = UrlParameter.Optional
         });



    routes.MapRoute(
         "ActualBrowse",
         "Gallery/Browse/{searchterm}",
         new
         {
             controller = "Gallery",
             action = "Browse",
             searchterm=UrlParameter.Optional
         });



답변

컨트롤러에서 이름이 같은 작업 메서드는 최대 2 개까지만 가질 수 있습니다. 이렇게하려면 1 개는이어야 [HttpPost]하고 다른 하나는이어야합니다 [HttpGet].

두 메서드 모두 GET이므로 작업 메서드 중 하나의 이름을 바꾸거나 다른 컨트롤러로 이동해야합니다.

2 개의 Browse 메서드가 유효한 C # 오버로드이지만 MVC 작업 메서드 선택기는 호출 할 메서드를 파악할 수 없습니다. 방법에 대한 경로를 일치 시키려고 시도 할 것이며 (또는 그 반대로)이 알고리즘은 강력한 유형이 아닙니다.

다른 작업 방법을 가리키는 사용자 지정 경로를 사용하여 원하는 작업을 수행 할 수 있습니다.

… Global.asax에서

routes.MapRoute( // this route must be declared first, before the one below it
     "StartBrowse",
     "Gallery/Browse/Start/Here",
     new
     {
         controller = "Gallery",
         action = "StartBrowse",
     });

routes.MapRoute(
     "ActualBrowse",
     "Gallery/Browse/{searchterm}",
     new
     {
         controller = "Gallery",
         action = "Browse",
         searchterm = UrlParameter.Optional
     });

… 컨트롤러에서 …

public ActionResult Browse(string id)
{
    var summaries = /* search using id as search term */
    return View(summaries);
}

public ActionResult StartBrowse()
{
    var summaries = /* default list when nothing entered */
    return View(summaries);
}

구별하기 위해 속성을 적용 하여 컨트롤러에서 동일한 이름의 조치 메소드유지할 수도 있습니다 [ActionName]. 위와 동일한 Global.asax를 사용하면 컨트롤러는 다음과 같습니다.

public ActionResult Browse(string id)
{
    var summaries = /* search using id as search term */
    return View(summaries);
}

[ActionName("StartBrowse")]
public ActionResult Browse()
{
    var summaries = /* default list when nothing entered */
    return View(summaries);
}


답변

질문이 언제이 솔루션을 사용할 수 있었는지 모르겠지만 다음을 사용할 수 있습니다.

Request.QueryString["key"]

따라서 이것은 문제에 대해 잘 작동합니다.

[HttpGet]
public ActionResult Browse()
{
    if( Request.QueryString["id"] != null )
        var summaries = /* search using id as search term */
    else /*assuming you don't have any more option*/
        var summaries = /* default list when nothing entered */

    return View(summaries);
} 


답변

기본 경로 앞에 RouteConfig.cs에 다음 코드를 추가 합니다.

routes.MapMvcAttributeRoutes();

다음과 같이 컨트롤러에 경로 속성을 추가합니다.

    [Route("Cars/deteals/{id:int}")]
    public ContentResult deteals(int id)
    {
        return Content("<b>Cars ID Is " + id + "</b>");
    }

    [Route("Cars/deteals/{name}")]
    public  ContentResult deteals(string name)
    {
        return Content("<b>Car name Is " + name + "</b>");

    }


답변

요점은 요청 클래스를 사용하여 쿼리 문자열 매개 변수를 암시 적으로 테스트 할 필요가 없다는 것입니다.

MVC가 매핑을 수행합니다 (MVC 경로를 심각하게 변경하지 않은 경우).

따라서 액션 링크 경로

/umbraco/Surface/LoginSurface/Logout?DestinationUrl=/home/

정의 된 매개 변수를 사용하여 (표면) 컨트롤러에서 자동으로 사용할 수 있습니다.

public ActionResult Logout(string DestinationUrl)

MVC가 작업을 수행합니다.


답변