2012-12-28 5 views
0

일반적으로 ASP.Net MVC 및 MVC 아키텍처가 처음입니다. 데이터베이스 코드 우선 메서드를 사용하여 간단한 응용 프로그램을 작성합니다.매개 변수가있는 기본 ASP.NET MVC 쿼리

레시피를 만든 사용자의 ID 인 cookId이라는 속성이있는 레서피 모델이 있습니다.

이제 쿼리 문자열을 내 페이지로 전달하고 cookId가 매개 변수와 동일하고 내 View의 목록을 작성하는 요리법 만 가져오고 싶습니다.

어떻게하면됩니까? 이 논리는 어디에 두어야합니까? 내 controller 또는 내 view에 있습니까?

답변

2

음, 경로, 또는 TableRoutes와 asp.net MVC 작동합니다. 기본 경로는 {controller}/{action}/{id} 형식으로 생성됩니다.

따라서 작업 요청을 받으면 컨트롤러에서이 매개 변수를 id 매개 변수에서 다시 검색하고이 값을 사용하여 데이터베이스를 조회하고보기에 표시해야하는 모든 기록을 얻을 수 있습니다 . 당신은 또한 ID를 가져 Request.QueryString["Id"]을 사용할 수

public ActionResult Recipes(string id) 
{ 
    IEnumerable<Recipe> list = _repository.GetRecipeByCookId(id); // this method should return list of Recipes 

    return View(list); // return your View called "Recipes" passing your list 
} 

하지만 asp.net의 MVC에서 좋은의 연습되지 않습니다 :이 liek 뭔가를 시도 할 수 있습니다. 당신은 당신의 행동에 매개 변수를 사용하고 그것을 사용할 수 있습니다. 당신의보기에

, 당신은 IEnumerable<Recipe>로를 입력하고 테이블에 그것을 보여줄 수, 뭔가 같은 :

@model IEnumerable<Recipe> 

<table> 
    @foreach(var recipe in Model) 
    { 
     <tr> 
      <td>@recipe.Name</td>   
      <td>@recipe.CookId</td> 
      <td>@recipe.OtherProperties</td> 
     </tr> 
    } 
</table> 

요청이 ID를 통과하는 링크를 만들려면, 당신은 단지 Html.ActionLink, 뭔가를 사용할 수 있습니다 처럼보기에 :

@Html.ActionLink("Text of You Link", "Action", "Controller", new { id = 5, another = 10 }, new { @class = "css class for you link" }); 

와 asp.net MVC는 Global.asax에에 살고 있고 routetable 다음은 apropriated 경로를 가진 a 태그를 렌더링합니다. 쿼리 문자열을 전달할 다른 매개 변수가있는 경우 another 매개 변수가있는 샘플에서했던 것처럼 추가 할 수도 있습니다.

+2

거의 없지만 아주 좋습니다. 기본 경로를 사용하면 id를 단일 객체의 id로 처리해야합니다. url이 Home/Cooks/5 인 경우 5는 요리사의 ID 여야합니다. 비슷하게 URL이 Home/Recipes/3 인 경우 3은 조리법 3을 제외한 모든 조리법을 나타내야합니다. 홈/조리법 /? cookId = 5는 ID가 5 인 요리사의 모든 요리법을 반환해야합니다. –

+0

예 @seanwoodward 당신이 맞습니다 +1. :). 의미 상으로는 id 매개 변수를 사용하여 친숙한 URL을 사용할 수 있다고 생각합니다. 나는 그것이가는 것이 가장 좋은 방법인지 잘 모르겠지만 그것은 나를 위해 잘 작동합니다. –

1

NEVER 뷰에 논리를 넣으십시오. 보기에는 모델에 제공된 정보 만 표시됩니다. 로직을 컨트롤러에 넣으십시오.

컨트롤러 :

[HttpGet] 
public ActionResult Recipes(int cookId) 
{ 
    var recipes = /* get recipes based on cook */; 
    List<RecipeModel> model = recipes 
     .Select(r => new RecipeModel 
     { 
      Id = r.Id, 
      CookId = r.CookId, 
      ... 
     }) 
     .ToList(); 
    return View(model); 
} 

보기 :

@model List<RecipeModel> 

@foreach (RecipeModel item in Model) 
{ 
    <div> 
     <span>Id:</span> 
     <span>@item.Id</span> 
    </div> 
} 
1

컨트롤러 :

[HttpGet] 
public ActionResult GetRecipes(int cookId) 
{ 
    // model can view a List<Recipe>, logic goes here 
    var model = SomeQueryThatReturnsRecipesFrom(cookId); 
    return View(model) 
} 

보기 (예 : 뷰에 대한 \ yourController \ GetRecipes.cshtml) 만 표시하려면이 파일을 사용 데이터, 그 로직을 여기에 넣어 추천하지 않습니다 :

@model List<Namespace.Recipe> 

<h2>Recipes</h2> 

@foreach(var r in Model) 
{ 
    <p>r.Name</p> 
} 

이것은 다음과 같은 쿼리 문자열로 호출됩니다

/Recipes/GetRecipes?cookId=SomeId 
1

CooksController가있을 수 있습니다. 그 컨트롤러는 요리사의 목록을 반환합니다. 이 목록에는 요리사의 요리법에 대한 링크가 포함될 수 있습니다.RecipesController는 주어진 cookI에 대한 모든 recipes에 대한 요청을 처리 할 수 ​​있습니다.

@Html.ActionLink("Recipes", "RecipesByCook", "Recipes", new { cookId = model.cookId }, null}; 

위의 코드는 Cooks/Index.shtml보기에 사용됩니다. 쿼리 문자열을 사용하여 원하는대로 cookId를 식별하는 링크를 만듭니다.

RecipesController에는 cookId에 대한 매개 변수를 취하는 RecipiesByCook 메소드가 있습니다. 이 메소드는 Home/Recipies/RecipeByCook? cookId = 4와 같은 URL 요청을 처리합니다.

그러면 RecipesController는 올바른 조리법 세트가 표시된 ActionResult를 반환 할 수 있습니다. 매우 간단합니다 (요리사에 대한 정보와 같이 표시 할보기에 더 많은 것을 추가 할 수도 있음).

public ActionResult RecipesByCook(int cookId) 
    { 
     var recipes = repository.Recipes.Where(r => r.cookId == cookId); 

     return View(recipes); 
    } 
관련 문제