2012-07-27 4 views
3

저는 입니다. MVC에 완전히입니다. 문제를 설명하는 동안 나에게 들러주세요. 내가 검색 할 수 있도록 경로 id 매개 변수를 기반으로, 나는 사용자 정의 사용자 컨트롤을 렌더링하기 위해 노력하고있어이 ActionResult에서MVC 3 매개 변수 사전에 null이 아닌 유형의 매개 변수 'id'에 대한 null 항목이 포함되어 있습니다.

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

: 내 기본 경로에 id 매개 변수를 통해 내 DB에서 데이터를 검색하기 위해 노력하고있어 요청 년대 페이지에 대한 관련 데이터

public ActionResult InitPageNav(int id) 
{ 
     PageModel page = PageNavHelper.GetPageByID(id); 
     return PartialView("UserControls/_PageNavPartial", page); 
} 

편집 *

public static MvcHtmlString CreateMenuItems(this HtmlHelper helper, string action, string text) 
{ 
    var menuItem = new TagBuilder("li"); 
    var link = new TagBuilder("a"); 

    //Get current action from route data 
    var currentAction = (string)helper.ViewContext.RouteData.Values["action"]; 
    link.Attributes.Add("href", string.Format("/Home/{0}", action)); 

    if (currentAction == action) 
    { 
     menuItem.AddCssClass("selected"); 
     link.Attributes.Remove("href"); 
     link.Attributes.Add("href", string.Format("/Home/{0}", currentAction.ToString())); 
    } 

    link.SetInnerText(text); 
    menuItem.InnerHtml = link.ToString(); 

    return MvcHtmlString.Create(menuItem.ToString()); 
} 

하지만 오류가 계속 :

The parameters dictionary contains a null entry for parameter 'id' of non-nullable type

어디에서 내가 잘못 될 수 있습니까?

은 정수가, URL에 필요한과 같이되어,

+0

보기에서 링크를 어떻게 생성합니까? 샘플 생성 URL은 어떻게 생겼습니까? – nemesv

+0

그래서 Url은 어떻게 생겼습니까?/컨트롤러/initpagenav/1? –

+0

헬퍼 메서드를 사용하여 링크를 생성하고 있습니다. 게시물을 편집 할 것입니다. – dtsg

답변

6

이 작업을 호출하려면 감사 :/홈/InitPageNav/1

어느 쪽이든 또는 null 허용 정수 수 있도록 조치 방법을 변경 (하지만 id가 주어지지 않으면 검색 할 수있는 기본 페이지가 없다면 말이 안된다.).

URL에 페이지 ID를 표시하지 않으려면 제목과 같이 페이지를 식별 할 다른 것이 필요합니까?

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

과 조치 : 제목 매개 변수가 널 (null)/빈입니다

public ActionResult InitPageNav(String title) 
{ 
     PageModel page = PageNavHelper.GetPageByTitle(title); 
     return PartialView("UserControls/_PageNavPartial", page); 
} 

그냥 경우를 처리해야합니다. 그리고 일반적으로 Mvc 프레임 워크에있는 헬퍼/확장을 사용하여 URL을 작성해야합니다.

@Html.ActionLink("Link text", "action", "controller", new { title = "whatever" }, null) 

또는 고급 도우미에서 예외/오류가 ASP .NET MVC 프레임 워크에 의해 발생하는 경우

public static MvcHtmlString CreateMenuItems(this UrlHelper url, string action, string text) 
{ 
    var menuItem = new TagBuilder("li"); 
    var link = new TagBuilder("a"); 

    //Get current action from route data 
    var currentAction = (string)helper.RequestContext.RouteData.Values["action"]; 
    link.Attributes.Add("href", url.Action(action, "home", new { title = "whatever" })); 

    if (currentAction == action) 
    { 
     menuItem.AddCssClass("selected"); 
    } 

    link.SetInnerText(text); 
    menuItem.InnerHtml = link.ToString(); 

    return MvcHtmlString.Create(menuItem.ToString()); 
} 
+0

원래이 작업과 비슷하지만 파일 이름으로 페이지를 가져 오는 것이지만 파일 이름이 쉽게 변경 될 수 있으므로 좋은 생각이라고 생각하지 않았습니다. 파손을 일으킬 수 있으므로 db의 PK는 다른 문제. – dtsg

+0

그러나 열쇠가 ID 인 경우 URL에 ID가 필요하거나 다른 것을 생각해야합니다! 어떤 페이지를 사용할지, 어떤 방법으로 사용할지 결정해야합니다. –

+0

예 ID는 페이지 키입니다. – dtsg

6

,이 예외의 이유는 'ID'매개 변수가 있다는 것입니다 HTTP 요청에 전달되지 않습니다.

봅니다 다음에 액션 메소드 서명을 다시 정의하기 :

public ActionResult InitPageNav(int? id) //id is now a nullable int type 
    { 
      if(!id.HasValue) //id parameter is set ? 
      { 
       //return some default partial view or something 
      } 

      PageModel page = PageNavHelper.GetPageByID(id); 
      return PartialView("UserControls/_PageNavPartial", page); 
    } 

편집 : 당신은 그때 당신은 단지를 변경해야, '문자열'에 id 매개 변수 유형을 변경하는 것이 더 유용하다 생각하는 경우 액션 메소드 서명.

+0

나는 이미 이것을 시도했지만'id'는 항상'null'입니다. 그러나 나는이 IMO는 가난한 솔루션입니다 내 링크의 모든 끝에 ID를 넣어 해결할 수 있습니다 – dtsg

+0

@ Duane 당신이 생성 된 URL을 보여줄 수,이 문제를 해결하는 데 도움이 될까요? – hiddenbyte

+0

'

  • Masterplan
  • '한 가지 예입니다. 내가 말했듯이, 만약 내가'
  • Masterplan
  • '을 사용하면 작동 하겠지만, 나는 그들에 ID가없는 URL을 선호 할 것이다. – dtsg

    관련 문제