2013-01-08 1 views
1

루프 내에서 Location 유형의 개체를 List<Location> 속성에 추가하려고합니다.C# nullreference 예외를 나열합니다. ASP.net MVC

CONTROLLER :

[HttpPost] 
public ActionResult Index([Bind(Include = "CitySearch")]HomeViewModel model) 
{ 
    List<CityIdentity> ids = null; 
    ids = service.GetNamesId(model.CitySearch); 

    foreach (var id in ids) 
    { 
     var loc = service.GetLocation(id.CityId); 
     var location = new Location 
     { 
      CityId = id.CityId, 
      Place = loc.Place, 
     }; 
     model.Locations.Add(location); 
    } 
} 

뷰 모델 :

public class HomeViewModel 
{ 
    public string CitySearch { get; set; } 

    public List<Location> Locations { get; set; } 

} 

model

유형 HomeViewModel이며 Locations 속성 유형 List<Location>이다. modelHttpPost 양식의 인스턴스이며보기에 양식을 제출하지 않았습니다.

디버깅 중이며 model.Locations.Add(location)에 오류가 발생하여 object reference not set to an instance of an object. 및 nullref 예외가 발생합니다.

아이디어가 있으십니까?

+2

'위치 '는 아마도 null입니다. 아마도 모델 바인더가 그 유형을 놓치게 만드는 마크 업 문제 일 것입니다. – asawyer

+0

개체에'model'이 어떻게 할당되어 있습니까? – keeg

+0

모델의 생성자에서 속성을 초기화하는 것이 좋으므로 다음을 추가 할 수 있습니다.위치 = 새 HashSet (); – torm

답변

2

반응 및 컨텍스트에 따라 Locations 속성이 초기화되지 않았으므로이 컬렉션에서 Add 메서드를 사용할 수 없습니다. 이 문제를 극복하려면 먼저이 속성을 초기화해야합니다. 그런 다음 원하는 방식으로 조작 할 수 있습니다.

이 목표를 달성하는 한 가지 방법은 모델 생성자 (또는 적합하다고 판단되는 곳)에 Locations 속성을 초기화하는 것입니다.

그래서 그냥 이런 식으로 뭔가를 추가하고 당신은 갈 수 있어요 :

Locations = new List<Location>(); 

이이 방법을 사용하기에 충분한 재산을 초기화합니다.

+0

그게 전부였습니다! 최고 감사합니다! (언젠가는 C#을 배우게 될 것입니다 :) – user1121487

+0

@ user1121487 환영합니다, 도움이 되니 기쁩니다! :) – walther

2

어떤 아이디어가 있습니까?

예, model 변수가 null이거나 Locations 속성이 null입니다. 따라서 model.Locations에 액세스하기 전에 이들이 null이 아닌지 확인하십시오. 그렇지 않으면 예외는 완벽하게 정상입니다. null 인스턴스에서 메소드를 호출 할 수 없습니다. 그런데 표준 디버깅 기술 (코드에 중단 점 넣기, 디버그 모드에서 응용 프로그램 실행 및 변수 값 검사)을 사용하면 동일한 결론을 얻을 수있었습니다.

이제 model 또는 model.Locations 속성이 null 인 이유가 전혀 다른 질문입니다. 제출하신 양식에 standard naming conventions for binding to a List을 (를) 준수하는 입력 요소가 포함되어 있지 않은 것 같습니다. 기본 모델 바인더가 POST 작업에서 모델을 재수화할 것으로 예상되는 경우 해당 규칙을 숙지하고 존중 해주십시오.

어쨌든 model을 작업 인수로 넣고 ASP.NET MVC가 자동으로 해당 항목을 채우는 것으로 예상합니까? ASP.NET MVC가 작동하는 방식이 아닙니다. 마법은 없습니다. ASP.NET MVC는 엄격한 규칙을 가진 모델 바인더를 사용합니다. 당신이 액션에 대한 논쟁으로 보내는 것만이 당신이 되돌아 오기를 기대할 수있는 것입니다.

+0

Locations가 null 인 것처럼 보입니다. 그러나 나는 그것을 초기화하는 방법을 이해하지 못한다. 대신이 경우 : model.Locations = service.GetLastnames ("name") - List 객체를 반환합니다. 모든 것이 작동합니다. 위치는 어떻게 초기화합니까? – user1121487

+0

@ user1121487 게시 된 코드/문제가 컨트롤러 클래스의 작업 멤버의 일부입니까? 그렇다면 마크 업과 원본 게시물 데이터를 게시하십시오 (Fiddler2와 함께하기 쉽습니다). – asawyer

+0

어떻게 알게 될까요? 나는이 속성을 어떻게 초기화 할 것인지 전혀 모른다. 당신이하려는 일에 대해 당신의 질문에 어떤 맥락을 제공했다면, 당신의 모델과 견해가 어떻게 생겼는지, 아마 당신의 질문에 대답했을 것입니다. 하지만 지금은 마치 당신이 중국어로 당신의 질문을 쓴 것처럼입니다 (중국어 간체, 중국어 간체가 아님). 그런데이 속성이 뷰에 입력 된 값으로 채워지기를 기대하는 경우 나는 내 대답에 링크 된 기사를 읽고 표준 컨벤션을 익히도록 초대합니다. –

관련 문제