情報応用演習Ⅰ(2024)

【課題6-04】商品管理その2(編集・削除の追加)

プロジェクトタイプASP.NET Core Web アプリ(Model-View-Controller)
プロジェクト名Prac_6_04
ソリューション名PIT6x
ターゲットフレームワーク.NET 8.0(長期的なサポート)
最上位レベルのステートメントを使用しない使用する(チェックオフ)
今回の課題について
  • 作業成果物とは別のソリューションとなるので注意すること!!
    • 作業成果物とはソリューション名が異なる.
      • 作業成果物→PIT6
      • プログラミング課題→PIT6x
  • 今回の課題はWebClassに提出場所があるのでそちらに提出すること.
    • 今までの課題と異なり今回の課題はリアクションペーパーに記載するものではないことに注意せよ.
  • これらはすべて課題点として成績に算入される課題である.
    • 加点要素ではなく 必須の課題である ことに注意せよ.

【課題6-03】のWebアプリに,商品の追加・削除機能を追加せよ. コントローラー名やアクション名などは_に従うこと. また,画面の挙動については_をよく見て実装すること

画面イメージと画面遷移
注意
  • 回答の作成の際は,【課題6-03】で作成したプロジェクトを複製して用いること.
  • この設問ではコントローラーは基本的に手作業で作成すること.
    • Homeを除いてVisual Studio の機能を用いて自動生成したコントローラーを使用しないこと.
  • やりかたによらず 自分以外(他の学生,学外の協力者,生成AIなど)が作成したソースコードを自身の成果物として提出してはならない
    • 違反が発覚した場合,その課題の評点と同じだけ成績から引くこととする.他の学生と回答を共有した場合は,元がどちらであるかに関わらず両者とも同じ処分とする. 課題は独力で取り組みむこと

このアプリはHomeコントローラーと,Productsコントローラーの二つのコントローラーで構成される. 基本的な機能は【課題6-03】と同じである.差分のある部分のみを_に示す.

Productsコントローラーのアクション
アクションGET メソッドでアクセスした際の機能POST メソッドでアクセスした際の機能
Index商品一覧の表示

備考1 : 「ID」の昇順で表示する.
備考2 : 各商品ごとに編集画面(Editアクション)と削除画面(Deleteアクション)へのリンクを設置する.
(POSTでのアクセスはしない)
Edit
各商品の編集画面の表示.
GET用のEditアクションは編集対象の商品IDをルーティングパラメーターとして受け取り,その商品のための編集画面を表示する.画面レイアウトは_および_を参照せよ .

備考1 : 入力欄にはあらかじめ以下のように入力されている状態とすること.
・名前→(編集対象の商品の商品名)
・定価→(編集対象の商品の定価)
・説明→(編集対象の商品の説明)
備考2 : IDは編集させないこと.
備考3 : ルーティングパラメータが指定されていない場合や,存在しない商品IDが指定された場合は 404 Not Found を返すこと.
DBの既存レコードの更新.
POST用のEditアクションは編集対象の商品IDをルーティングパラメーターとして受け取り,かつ変更内容をフォームデータとして受け取る.

備考1 : 処理後の遷移先は以下のようになる.
入力データが正常な場合 : Indexへ遷移
入力データに誤りがある場合 : Editへ遷移
備考2 : 入力欄にはあらかじめ以下のように入力されている状態とすること.
・名前→以前に入力した値
・定価→以前に入力した値
・説明→以前に入力した値備考3 : ルーティングパラメータが指定された商品IDが,フォームの隠しパラメータで指定された商品IDと一致しない場合は 404 Not Found を返すこと.
Delete
各商品の削除画面の表示.
GET用のDeleteアクションは削除対象の商品IDをルーティングパラメーターとして受け取り,その商品のための削除画面を表示する.画面レイアウトは_および_を参照せよ .

備考 : ルーティングパラメータが指定されていない場合や,存在しない商品IDが指定された場合は 404 Not Found を返すこと.
DBの既存レコードの削除.
POST用のDeleteアクションは削除対象の商品IDをルーティングパラメーターとして受け取り,かつ商品情報のIDのみをフォームデータとして受け取る.

備考1 : 処理後はIndexへ遷移する.
備考2 : ルーティングパラメータが指定された商品IDが,フォームの隠しパラメータで指定された商品IDと一致しない場合は 404 Not Found を返すこと.

各種テンプレート

いくつかのファイルに関しては以下のテンプレートを使用すること.

Controllers/ProductsController.cs(一部)

ProductsコントローラーのEditアクション(GET/POST)とDeleteアクション(GET/POST) は _に示す定義を使用すること.

Controllers/ProductsController.csの一部
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Editアクション(GET用)
public IActionResult Edit(int? id)
{
    if (id == null)
        return NotFound();

    var product = (from s in _context.Products
                    where s.Id == id
                    select s).FirstOrDefault();

    if (product == null)
        return NotFound();

    return View(product);
}

// Editアクション(POST用)
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Edit(int id, Product product)
{
    if (id != product.Id)
        return NotFound();

    if (ModelState.IsValid)
    {
        /***************************************************/
        /*                                                 */
        /*                     空欄1                       */
        /*                                                 */
        /***************************************************/
    }
    else
    {
        /***************************************************/
        /*                                                 */
        /*                     空欄2                       */
        /*                                                 */
        /***************************************************/
    }
}

// Deleteアクション(GET用)
public IActionResult Delete(int? id)
{
    if (id == null)
        return NotFound();

    var product = (from s in _context.Products
                    where s.Id == id
                    select s).FirstOrDefault();

    if (product == null)
        return NotFound();

    return View(product);
}

// Deleteアクション(POST用)
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Delete(int? id, [Bind("Id")] Product product)
{
    if (id == null)
        return NotFound();

    if (id != product.Id)
        return NotFound();

    /***************************************************/
    /*                                                 */
    /*                     空欄3                       */
    /*                                                 */
    /***************************************************/
    
    return RedirectToAction(nameof(Index));
}
Controllers/ProductsController.cs(一部) : 閉じる
Views/Products/Delete.cshtml

Views/Products/Delete.cshtml は_を使用すること.

Views/Products/Delete.cshtml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
@model Product

@{
    ViewData["Title"] = "商品削除";
}

<form asp-action="Delete" method="post">
    <input type="hidden" asp-for="@Model.Id" />

    <p>商品ID:@Model.Id「@Html.DisplayFor(m => m.Name)」を削除しますか?</p>
    
    <input type="submit" value="削除" />
</form>

<a asp-action="Index">一覧へ戻る</a>
Views/Products/Delete.cshtml : 閉じる

実行結果

正しく実装できた場合,実行結果は_のようになる (制作の都合上,動画ではプロジェクト名などが異なるが提出物では冒頭の指定を守ること).

実行結果

ヒント

なし

Last updated on 2024-06-10
Published on 2024-06-10

Powered by Hugo. Theme by TechDoc. Designed by Thingsym.