带参数的基本ASP.NET MVC查询

时间:2012-12-28 21:03:17

标签: asp.net asp.net-mvc entity-framework razor

我是ASP.Net MVC和MVC架构的新手。我正在使用Database Code First方法构建一个简单的应用程序。

我有一个配方模型,其中包含一个名为cookId的属性,该属性是创建配方的用户的ID。

现在我希望能够将查询字符串传递给我的页面,并且只获取其中cookId与参数相同并在我的视图中列出i的配方。

我怎样才能做到这一点?我应该把这个逻辑放在哪里?在我的controller或我的view

4 个答案:

答案 0 :(得分:2)

嗯,asp.net mvc适用于路由或TableRoutes。使用以下格式创建默认路由:{controller}/{action}/{id}

因此,当您收到有关您的操作的请求时,您可以从Action(控制器)上的id参数中检索此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
}

您也可以使用Request.QueryString["Id"]来获取ID,但在asp.net mvc中这不是一个好的实践。您可以在操作中使用参数并使用它。

在您的视图中,您可以使用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上设置的路由表之后呈现带有适当路由的a标记。如果你有其他参数传递查询字符串,你也可以像我在带有another参数的样本上那样添加它。

答案 1 :(得分:1)

从不在视图中放置逻辑。视图应该只显示模型中提供的信息。将逻辑放在控制器中。

控制器:

[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>
}

答案 2 :(得分:1)

控制器:

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

查看(例如views \ yourController \ GetRecipes.cshtml),只使用此文件显示数据,不建议将逻辑放在此处:

@model List<Namespace.Recipe>

<h2>Recipes</h2>

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

将使用以下查询字符串调用:

/Recipes/GetRecipes?cookId=SomeId

答案 3 :(得分:1)

你可能有一个CooksController。该控制器将返回一个厨师列表。该列表可能包含厨师食谱的链接。 RecipesController可以处理给定cookId的所有食谱的请求。

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

以上代码用于视图Cooks / Index.shtml。它创建一个链接,使用查询字符串来标识您想要的cookId。

RecipesController将有一个方法RecipiesByCook,它接受cookId的参数。此方法将处理对此类URL,Home / Recipies / RecipeByCook?cookId = 4的请求。

然后,您的RecipesController可以返回一个ActionResult,其中包含要显示的正确配方集。非常简单(如您可能想要为要显示的视图添加更多内容,例如关于厨师的信息):

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

        return View(recipes);
    }