2012-08-25 4 views
1

다음 작업은 쿼리 문자열이 필요하지 않지만 URL에 전달할 Id가 필요합니다.쿼리 스트링이 필요없는 컨트롤러 동작을 어떻게 정의합니까?

public ViewResult Details(int id) 
    { 
     Domain domain = db.Domains.Find(id); 
     return View(domain); 
    } 

어떻게 이름을 ID 대신 URL로 전달할 수 있도록 이것을 변경합니까?

다음과 같이 변경하면 실행 방법에 관계없이 "시퀀스에 요소가 없습니다"라는 오류가 발생합니다.

public ViewResult Details(String name) 
    { 
     Domain domain = db.Domains.Where(d => d.Name == name).First(); 
     return View(domain); 
    } 

어떤 도움

이 크게 감사합니다.

답변

3

은 LINQ 쿼리가 어떤 결과를 반환하지 않기 때문에 오류가있다 "시퀀스에 요소가없는"이 where 절하지만 당신은하지 않은 (결과 집합에 First() 기능을 적용하기 위해 노력하고있다 이 경우 귀하의 where 조건에 사용 가능).

이 함수를 적용 할 결과 집합에 Atleast 요소 하나가 있음을 확신 할 때 First() 함수를 사용하십시오. LINQ 표현식 결과로 요소가 없으면 First을 적용하면 위의 오류가 발생합니다.

URL이 정수 ID 대신 name 매개 변수를 갖기 위해서는 매개 변수 유형을 string으로 변경하십시오. 변수 이름은 id으로 유지하십시오. 그것이 MVC 라우팅이 여러분이 예쁜 URL을 작성하는 데 도움이 될 것이기 때문입니다.

../SomeController/Details/someName 

someNameDetails 액션 메소드의 매개 변수 값이 될 것입니다 경우처럼

그래서 지금 당신의 URL이 될 수 있습니다.

나는 FirstOrDefault을 사용하고 요소가 LINQ 표현에 사용 가능한지 확인합니다. FirstOrDefault은 시퀀스의 첫 번째 요소를 반환하거나 시퀀스에 요소가 없으면 기본값을 반환합니다.

public ViewResult Details(String id) 
{ 
    Domain domain = db.Domains.Where(d => d.Name == id).FirstOrDefault(); 
    if(domain!=null) 
     return View(domain); 
    else 
     return View("NotFound") //Lets return the Not found View 
} 
+0

고맙습니다. 그것은 예상대로 정확하게 작동합니다. – alockrem

+0

@alockrem : 천만에. 다행히 도울 수있어 :) – Shyju

관련 문제