1

我有一个问题,包括通过存储过程显示表中的所有数据。我正在使用 LINQ 访问我的存储过程,但问题是我的结果(显示的数据)只是我的表中的最后一行。我无法让它工作......如果有人可以帮助我/解释我做错了什么,我将不胜感激。

模型: RecipeModel

public class RecipeModel
{
.....
        public void GetAllRecipes()
        {
            DataClassesDataContext db = new DataClassesDataContext();        

            var result = db.p_get_all_recipes();

            foreach (var r in result)
            {
                this.recipeName = r.name;
                this.recipeDescription = r.description;
                this.recipeSteps = r.steps;
                this.createdAt = r.createdAt;
                this.updatedAt = r.updatedAt;
                this.ownerID = r.owner_id;
            }

        }

控制器RecipeController

public class RecipeController : Controller
{
        [HttpGet]
        public ActionResult Index()
        {
            RecipeModel rec = new RecipeModel();
            rec.GetAllRecipes();

            return View(rec);
}

查看(剃刀)Index

@model MVC3_LINQ_SP.Models.RecipeModel
@{
    ViewBag.Title = "Index";
}

<legend>Recipe </legend>

        <p>@Html.DisplayFor(model => model.rName)</p>
4

4 回答 4

1

您实际上并没有返回存储过程的值,RecipeModel而是覆盖了 的属性。

您应该创建一个 Recipe 类来保存存储过程的返回:

public class Recipe
{
    public string recipeName { get; set; }
    public string recipeDescription { get; set; }
    public string recipeSteps { get; set; }
    public DateTime createdAt { get; set; }
    public DateTime updatedAt { get; set; }
    public DateTime ownerID { get; set; }
}

然后更改您的程序以填写此内容 - 我假设 db.p_get_all_recipes() 正在返回可查询或列表:

public IQueryable<Recipe> GetAllRecipes()
{
    DataClassesDataContext db = new DataClassesDataContext();

    return db.p_get_all_recipes().Select(r => new Recipe()
        {
        recipeName = r.name;
        recipeDescription = r.description;
        recipeSteps = r.steps;
        createdAt = r.createdAt;
        updatedAt = r.updatedAt;
        ownerID = r.owner_id;
        });

}

然后你需要改变你的观点:

@model IQueryable<Recipe>

和你的控制器动作:

[HttpGet]
        public ActionResult Index()
        {
            RecipeModel rec = new RecipeModel();    
            return View( rec.GetAllRecipes(););
        }
于 2012-08-15T13:59:41.317 回答
0

您有一个RecipeModel类,其中有一个获取所有项目的方法(RecipeModel 的集合)。仔细看看你的方法。您正在循环遍历集合并一次又一次地设置类的属性(有效地类的对象)(覆盖到同一实例)

理想情况下,在循环中,您需要创建RecipeModel 的实例并设置值并将其添加到RecipeModel 的集合中。

我不会在你的 Model 类中混合这种方法。我会将它移到一个单独的类中,其中将有一个返回RecipeModel类列表的方法。一种存储方法。

于 2012-08-15T14:01:43.120 回答
0

你的模型有问题。您从 SP 加载所有配方,然后在循环中尝试将结果中的值设置为 RecipeModel 字段。但是在您的周期中,如果您有多个配方,那么您接下来要做的是:在迭代 1 中,您从配方 1 中获取值并将它们设置为 RecipeModel,之后您将进入迭代 2,并将配方 2 中的所有值再次设置为相同对象 RecipeModel 已经具有配方 1 中的值,因此您只需覆盖这些值。

因此,您需要从数据库中为每个配方创建一个单独的 RecipeModel。您传递给视图的模型应该是一个食谱模型列表,并且在您的视图中,您应该有 foreach 循环,它将将食谱写入 html。

于 2012-08-15T13:59:03.337 回答
0

您在以下 for 循环中覆盖您的局部变量:

foreach (var r in result)
{
    this.recipeName = r.name;
    this.recipeDescription = r.description;
    this.recipeSteps = r.steps;
    this.createdAt = r.createdAt;
    this.updatedAt = r.updatedAt;
    this.ownerID = r.owner_id;
}

您需要将每次迭代添加到模型的新实例并返回一个List或其他集合类型。

于 2012-08-15T13:59:22.280 回答