2015-01-28 2 views
0

Freeman에 의해 "ASP.NET MVC5"라는 책을 읽었으며 내 사이트에 관리 페이지를 추가하려고합니다. 내가 페이지 http://localhost:63843/Admin/Edit에 갈 때 지금, 나는이 오류가 : 매개 변수의"System.Int32"에 대한 NULL 값

사전 매개 변수 "productId에"유형 "선택 System.Int32"에 대한 NULL 값을 가진 항목이 포함되어, NULL 값을 허용하지 않는, "SportsStore.WebUI.Controllers.AdminController"의 "System.Web.Mvc.ViewResult Edit (Int32)"에 대한 메서드입니다. 선택적 매개 변수는 참조 유형, 유형이어야하며 값이 NULL이거나 옵션으로 선언되어야합니다. 매개 변수 이름 : 매개 변수 여기

public class AdminController : Controller 
{ 
    private IProductRepository repository; 

    public AdminController(IProductRepository repo) { 
     repository = repo; 
    } 

    public ViewResult Edit(int productId) { 
     Product product = repository.Products 
      .FirstOrDefault(p => p.ProductID == productId); 
     return View(product); 
    } 
} 

그러나이 편집에 대한 모든 참조하고 더 어떤 NULL 값이 없습니다 : 나는 그것을 언급 할 때

Product p1 = target.Edit(1).ViewData.Model as Product; 
Product p2 = target.Edit(2).ViewData.Model as Product; 
Product p3 = target.Edit(3).ViewData.Model as Product; 
Product result = (Product)target.Edit(4).ViewData.Model; 

는, 아무것도 변경되지는. 내가 알 수 없는데, 여기서 NULL 값입니다.

+1

'편집'을 누르면 적절한 'productId'가 전송되지 않습니다. 'int productId'를'int? '로 수정하십시오. productId'를 호출 한 다음 매개 변수가 실제로 null인지 확인하십시오. 계속하기 전에 당신이'null'을 처리하게하거나 왜 유효한 ID를'Edit'에 전달하지 않는지를 알아낼 것입니다. – Greg

+1

'ProductID'를'int? '로 정의하여 nullable로 만들 수 있습니다.이 경우 할당이 가능합니다. – aevitas

+0

아니요 @aevitas는 필수 매개 변수이며, 리소스를 편집하기 위해 nullable로 설정하지 마십시오. 나쁜 디자인을 제안하지 마라. – Phill

답변

2

액션은 int하는 매개 변수를 필요로하고 당신은 /편집? 제품 ID = 1`가 작동 브라우저에서 당신이 넣어 계세요하지만 통과, 또는 동작 파라미터는 null 수 있도록되어 있지 않습니다.

public ViewResult Edit(int? ProductId) 

이제는 오류가 발생하지 않습니다.

+0

도움이되었습니다. 모두에게 감사드립니다. – dima

1

당신의 라인

public ViewResult Edit(int productId) { 

에서 당신이 int으로 정의 된 매개 변수 productId 있습니다. 이 메시지는 null 허용 가능 매개 변수 또는 선택적 매개 변수 여야 함을 나타냅니다. 그래서 너무 Edit의 호출이 null 수신을 수락

// nullable 
public ViewResult Edit(int? productId) { ... } 

또는

// optional 
public ViewResult Edit(int productId = -1) { ... } 

에 하나를 CHAGE - 이런 일이 나되지 않습니다에 관계없이합니다.


매개 변수를 int로 만드는 것은 어떻습니까? ans stacktrace/callhirarchy를 분석하여 null 호출을 시도한 사람을 찾으려면 함수 안에 중단 점을 설정하십시오.

+0

"메시지는 null 허용 매개 변수 또는 선택적 매개 변수 여야합니다." <- 아니요. 코드가 정확합니다. 필수 매개 변수입니다. null이거나 선택적이 아니어야합니다. – Phill

+0

당신이 옳았는데 질문을주의 깊게 읽지 않았습니다. 나는 내 대답을 연장 할 것이다. –