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

モデルに問題があります。SP からすべてのレシピをロードし、その後サイクルで結果から RecipeModel フィールドに値を設定しようとしています。しかし、サイクルで複数のレシピがある場合は、次に行っています: 反復 1 でレシピ 1 から値を取得し、それらを RecipeModel に設定します。その後、反復 2 に進み、レシピ 2 のすべての値を再び同じ値に設定します。オブジェクト RecipeModel には既にレシピ 1 の値があるため、これらの値をオーバーライドするだけです。

そのため、データベースからレシピごとに個別の RecipeModel を作成する必要があります。ビューに渡すモデルは RecipeModels のリストである必要があり、ビューにはレシピを html に書き込む foreach サイクルが必要です。

于 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 に答える
0

すべてのアイテムを取得するメソッドを内部に持つRecipeModelクラスがあります (RecipeModel のコレクション)。あなたの方法を注意深く見てください。コレクションをループして、クラス(クラスのオブジェクト)のプロパティを何度も設定しています(同じインスタンスに上書きしています)

理想的には、ループ内で RecipeModel のインスタンスを作成し、値を設定して、それを RecipeModel のコレクションに追加する必要があります。

Model クラス内にこのメソッドを混在させません。クラスのリストを返すメソッドがある別のクラスにそれを移動しRecipeModelます。リポジトリ メソッド。

于 2012-08-15T14:01:43.120 に答える