質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

  • ASP.NET

    562questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

ASP.NET MVCで新規スキャフォールディングアイテムメニューを見つけたい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,545

cancat

score 239

こんにちは。 
Windows10でASP.NET MVCのアプリケーションを開発しています。 
Visual Studio 2017 Communityを使っています。 
ASP.NET MVCほぼ初心者です。

前提・実現したいこと

Modelをつくり、そこからスキャフォールディングでコントローラーとViewを作りたいです。

試したこと

(1)まったく空の新規ASP.NET MVC(.NET Core)プロジェクトをつくりました。
(2)Modelを作りました。
(3)ソリューションエクスプローラのControllsで右クリックし、追加-新規スキャフォールディングアイテムを選択しました。

発生している問題・エラーメッセージ

これでうまくいったので、既存のプロジェクトで作業しました。
(1)Modelを作りました。テストとの違いはNameSpaceです。(test->MyProject.WebAPI.Models)
(3)ソリューションエクスプローラのControllsで右クリックし、追加を選びました。

ところが新規スキャフォールディングアイテムメニューがありません。

両方のプロジェクトの違いは、
(1)Testはtarget frameworkが.NETCoreApp1.1、既存のは.NET Framework4.5
(2)Testは出力がコンソールアプリケーション、既存のはクラスライブラリ
(3)プロパティを見るとTestにはWeb, Webのパッケージ化/発行、SQLのパッケージ化/発行のメニュー項目が存在しない

などです。

なにをどうすればスキャフォールディングを実行できるのでしょう?

該当のソースコード

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace MyProject.WebAPI.Models
{
    public class Tenant
    {
        public int TenantId { get; set; }
    public Guid TenantGUID { get; set; }
    public string Name { get; set; }
    }

}

補足情報(言語/FW/ツール等のバージョンなど)

Microsoft Visual Studio Community 2017
Version 15.0.26228.9 D15RTWSVC
Microsoft .NET Framework
Version 4.6.01586

です。 
よろしくお願いします。

追記

http://blog.shibayan.jp/entry/20160928/1474990457
を参考に、NuGetで、
Microsoft.VisualStudio.Web.CodeGeneration.Tools
Microsoft.VisualStudio.Web.CodeGenerators.Mvc
を追加してみようとしましたが、これはASP.NET Core MVCの場合で、.NET 4.5では追加できませんでした。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2017/04/07 11:26

    最終的に作りたいのは、従前の「ASP.NET」+「.NET Framework」ベースのアプリなのか、新しい「ASP.NET Core」+「.NET Core」ベースのアプリなのか、どちらですか?

    キャンセル

  • cancat

    2017/04/07 12:27

    ASP.NET+.NET Frameworkです。

    キャンセル

回答 1

0

最終的に作りたいのは「ASP.NET+.NET Frameworkです」とのことですので、質問に書いてあった「ASP.NET MVC(.NET Core)プロジェクト」の話は忘れてレスします。

いろいろやり方があると思いますが、例えば以下のチュートリアルのように既存の DB から Visual Studio のウィザードを使って EDM を生成し、それをベースにすると Visual Studio のスキャフォールディング機能で CRUD 機能を持つ Controller と View を一式自動生成してくれます。

10 行でズバリ!! ASP.NET MVC を構成する各コンポーネントとネーミング ルール (C#)
https://code.msdn.microsoft.com/10-ASPNET-MVC-C-8566eeb5/

具体的には、VS2015 Community の場合ですが、ソリューションエクスプローラーで Controllers フォルダを右クリックして [追加(D)] ⇒ [コントローラー (T)...] をクリックすると、「スキャフォールディングを追加」というダイアログが表示されます。

EDM を作成済みなら、そこで、[MVC5 Controller with views, using Entity Framework] を選択し [追加] をクリックすると「Add Controller」ダイアログが表示されるので、そこで必要な情報を入力してから [Add] ボタンをクリックするだけの操作となります。

その操作で以下のような Controller のコードが自動生成されます。同時に Controller のアクションメソッドに対応した View もすべて自動生成されます。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using AdventureWorksLT;

namespace Mvc5App.Controllers
{
    public class AddressesController : Controller
    {
        private AdventureWorksLTEntities db = new AdventureWorksLTEntities();

        // GET: Addresses
        public ActionResult Index()
        {
            return View(db.Address.ToList());
        }

        // GET: Addresses/Details/5
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Address address = db.Address.Find(id);
            if (address == null)
            {
                return HttpNotFound();
            }
            return View(address);
        }

        // GET: Addresses/Create
        public ActionResult Create()
        {
            return View();
        }

        // POST: Addresses/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "AddressID,AddressLine1,AddressLine2,City,StateProvince,CountryRegion,PostalCode,rowguid,ModifiedDate")] Address address)
        {
            if (ModelState.IsValid)
            {
                db.Address.Add(address);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(address);
        }

        // GET: Addresses/Edit/5
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Address address = db.Address.Find(id);
            if (address == null)
            {
                return HttpNotFound();
            }
            return View(address);
        }

        // POST: Addresses/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "AddressID,AddressLine1,AddressLine2,City,StateProvince,CountryRegion,PostalCode,rowguid,ModifiedDate")] Address address)
        {
            if (ModelState.IsValid)
            {
                db.Entry(address).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(address);
        }

        // GET: Addresses/Delete/5
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Address address = db.Address.Find(id);
            if (address == null)
            {
                return HttpNotFound();
            }
            return View(address);
        }

        // POST: Addresses/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            Address address = db.Address.Find(id);
            db.Address.Remove(address);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}

クラス定義しかない場合は Controller と View 一式全て自動生成は無理だったと記憶していますが、それでも上の記事にあるように、スキャフォールディング機能を利用して、まず Contoller を生成してから View を生成するという手順では可能なはずです。

VS2017 はで少々違うかもしれませんが(使ってないので分かりません)、基本的なところは同じだと思います。

***** 2017/4/19 15:15 追記 *****

2017/04/19 15:10 の私のコメントで「回答欄に画像の URL を書いておきますので見てください」と書きましたが、それを以下に追記しておきます。

VS2015 Community の場合です。

(1) ソリューションエクスプローラーで Controllers フォルダを右クリックして [追加(D)]をクリックすると以下の画像のようになる:

http://surferonwww.info/BlogEngine/image.axd?picture=2017%2f4%2fAdventureWorksLT0.jpg

(2) 上の画像で [コントローラー (T)...] をクリックすると「スキャフォールディングを追加」というダイアログが表示される: 

http://surferonwww.info/BlogEngine/image.axd?picture=2017%2f4%2fAdventureWorksLT1.jpg

(3) EDM を作成済みなら、上の画像で [MVC5 Controller with views, using Entity Framework] を選択し [追加] をクリックすると「Add Controller」ダイアログが表示される:

http://surferonwww.info/BlogEngine/image.axd?picture=2017%2f4%2fAdventureWorksLT2.jpg

上の画像のように必要な情報を入力してから [Add] ボタンをクリックする。

その操作で Controller のコードが自動生成されます(上にアップしたコードを参照)。同時に Controller のアクションメソッドに対応した View もすべて自動生成されます。 

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/19 14:25

    すみません。

    具体的には、VS2015 Community の場合ですが、ソリューションエクスプローラーで Controllers フォルダを右クリックして [追加(D)] ⇒ [コントローラー (T)...] をクリックすると、「スキャフォールディングを追加」というダイアログが表示されます。

    とのことですが、このメニューもダイアログもでないので困っています。

    キャンセル

  • 2017/04/19 15:10

    なるべく間を開けずに返事をいただけると嬉しいのですが。

    質問者さんの環境で何故表示されないのか分かりませんが、自分の環境では間違いなく表示されます。回答欄に画像の URL を書いておきますので見てください。(何故かこの記事に直接画像を貼れないので、画像は自分のサーバーにアップしてそこへのリンクを張っておきます)

    キャンセル

  • 2017/04/19 17:30

    回答遅れてすみません。
    コメントありがとうございます。

    残念ながらそのメニューはない、という状況で、解決できませんでした。
    しかたないので、手で作ります。

    キャンセル

  • 2017/04/19 18:34 編集

    VS2015 ⇒ VS2017 でスキャフォールディングの機能・メニューがなくなったということは考えにくいのですが・・・

    どうしても VS2017 にメニューが見つからなければ、自力でコードを書くより、VS2015 を新たにインストールして使った方が早いと思いますよ。自力で書く工数もさることながら、自力で書いて間違えると(普通間違いはあるはず)その修正などに必要な工数もバカにならないはずですし。

    キャンセル

  • 2017/04/19 19:41

    はい。質問に書いた通り、新規に.netcoreを選択すると、メニューが出ます。
    しかし、既存のプロジェクトではでないのです。
    なので、なにかが違っていることはわかるのです。
    それを特定できないのです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • ASP.NET

    562questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。