tags

Mac版 SQL Server Management Studio (みたいなもの)SQL Operations Studio

.NET Coreが Linuxや Macに対応したのに合わせてデータベースツールも LinuxやMac対応できるツールが新しく Microsoftから出ています

● SQL Operations Studio

https://github.com/Microsoft/sqlopsstudio

Mac, Linux Windows対応です。

No.1253
06/19 10:33

edit

IIS で 特定のファイルを表示しないようにする

apacheでいう .htaccess にあたるのが IIS の Web.config です。
このファイルに次のように記述します。

例) test.txt を非表示にする
Web.config

<configuration>
      <system.webServer>
            <security>
            <requestFiltering>
            <denyUrlSequences>
                <add sequence="test" />
            </denyUrlSequences>
            <fileExtensions>
                <add fileExtension=".txt" allowed="false" />
            </fileExtensions>
            </requestFiltering>
            </security>
      </system.webServer>
<configuration>
No.1252
06/18 14:10

edit

ASP .NET MVC で XSS対策を一時的にオフにする

.NET WEBアプリでは XSS対策として HTMLタグらしきものを送信するとエラーとなります。 エラーになると次のようなエラーが表示されます

アプリケーションでサーバー エラーが発生しました。

● ASP .NET MVC で XSS対策を一時的にオフにする

YourController.cs

[ValidateInput( false )]

を加えます。 例 )

[ValidateInput( false )]
public ActionResult Index( Entry model )
{
    .....
}
No.1248
06/14 15:50

edit

ASP .NET Razorでカスタムエラーページを設定する

Web.config

<system.web>
    <customErrors defaultRedirect="~/Error/DefaultError.cshtml" mode="RemoteOnly">
      <error statusCode="404" redirect="~/Error/NotFound" />
    </customErrors>
mode="RemoteOnly"

にするとリモートでのみカスタムエラー画面が表示されます。

ローカルとリモート両方でカスタムエラー画面を表示させるには

mode="On"

とします。

No.1247
06/14 15:16

edit

ASP .NET RazorでWEBサイトのベースURLと物理パスを取得する

● ASP .NET RazorでWEBサイトのベースURLを取得する

引用 : https://www.wareko.jp/blog/post-21910

your-view-file.cshtml

@{
 var baseUrl = ""
            + Request.Url.Scheme + "://" 
            + Request.Url.Authority 
            + Request.ApplicationPath.TrimEnd('/'); 
}
@baseUrl/controller/method

http://localhost:49983/controller/method

と表示されます。

コントローラーから ViewData で渡す場合は
YourController.cs

string BASE_URL = Request.Url.Scheme + "://" + Request.Url.Authority + Request.ApplicationPath.TrimEnd( '/' );
ViewData["BASE_URL"] = BASE_URL;

your-view-file.cshtml

@ViewData["BASE_URL"]/controller/method

で渡します。

● .NET MVC で物理パスを取得するには Request を使用します。

Razorテンプレート内では @Request.ApplicationPath のように直接記述することができます。

<table>
    <tr><td>Request.ApplicationPath</td><td>@Request.ApplicationPath</td></tr>
    <tr><td>Request.FilePath</td><td>@Request.FilePath</td></tr>
    <tr><td>Request.Path</td><td>@Request.Path</td></tr>
    <tr><td>Request.FilePath</td><td>@Request.FilePath</td></tr>
    <tr><td>Request.PathInfo</td><td>@Request.PathInfo</td></tr>
    <tr><td>Request.PhysicalApplicationPath</td><td>@Request.PhysicalApplicationPath</td></tr>
    <tr><td>Request.PhysicalPath</td><td>@Request.PhysicalPath</td></tr>
    <tr><td>Request.RawUrl</td><td>@Request.RawUrl</td></tr>
    <tr><td>Request.Url</td><td>@Request.Url</td></tr>
</table>

例えば

http://localhost:49983/Debug/Url 

へのアクセスは

Request.ApplicationPath/
Request.FilePath/Debug/Url
Request.Path/Debug/Url
Request.FilePath/Debug/Url
Request.PathInfo
Request.PhysicalApplicationPathC:\my_dir\MY-PROJECT\PROJECT\
Request.PhysicalPathC:\my_dir\MY-PROJECT\PROJECT\Debug\Url
Request.RawUrl/Debug/Url
Request.Urlhttp://localhost:49983/Debug/Url

のような表示になります。

No.1246
06/14 15:00

edit

ASP .NET RazorのHTMLヘルパーの使い方と自作ヘルパーの作り方

● ASP .NET RazorのHTMLヘルパーの使い方

HTMLヘルパーはビュー( .cshtml )にて @Html.メソッド名 にて使用します。
例(HTMLエスケープを行わずそのまま出力する Raw() を呼び出す)

ViewData["message"] = "改行<br>します";
@Html.Raw( ViewData["message"] )

表示結果

改行
します

● ASP .NET Razorの主なHTMLヘルパー

こちらを参考に
http://blog.shibayan.jp/entry/20110327/1301152413

● 自作ヘルパーを作成する

例) 改行を<BR>タグに変換する自作ヘルパーを作成します。
【プロジェクト名】/Helpers/Myhelper.cs

using System;
using System.Web;
using System.Web.Mvc;

namespace 【プロジェクト名】.Helpers
{
    public static class Myhelper
    {
        public static MvcHtmlString newline2br( this HtmlHelper helper, string arg )
        {
            return MvcHtmlString.Create( arg.Replace( "\r\n", "\n" ).Replace( "\r", "\n" ).Replace( "\n", "<br>" ) );
        }
    }
}

テンプレートには以下のように記述します
mytemplate.cshtml

@using EVAA.Helpers

@Html.newline2br( "テスト\n文字列" )
No.1244
06/13 14:13

edit

.NET MVC ページで 独自の404ページを設置する

.NET MVC ページで 独自の404ページを設置する

● 1. Web.config に設定を記述

Web.config の「system.web」の下に 404 エラー時に /Error/NotFound へ移動するよう設定します
Web.config

  <system.web>

    <!--独自の404ページ-->
    <customErrors defaultRedirect="~/Error/" mode="On">
      <error statusCode="404" redirect="~/Error/NotFound"/>
    </customErrors>
    <!--独自の404ページ-->

● 2. コントローラー 「ErrorController 」を作成

ネームスペースの「MYAPP」のところは適宜書き換えてください。 NotFound のビューを返すようにしてあります

/Controllers/ErrorController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MYAPP.Controllers
{
    public class ErrorController : Controller
    {
        // GET: Error
        public ActionResult Index()
        {
            return View();
        }
        // GET: Error/NotFound
        public ActionResult NotFound()
        {
            ViewBag.Title = "Error 404";
            return View( "NotFound" );
        }
    }
}

● 3. ビュー 「NotFound」を作成

お好きなhtmlを作成してください。
/Views/Error/NotFound.cshtml

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <h1>404 Not Found.</h1>
</body>
</html>
No.1243
06/05 16:34

edit

.NET Core で セッションを使用する

● セッションに値をセットする

Session["キー"] = 値;
Session["login_name"] = "HogeHoge";

● セッションの値を取得する

Session["キー"]
Object nameObj = Session["login_name"];
string firstName = (string)(Session["First"]);

文字列でほしいときは string 型にキャストします

● セッションの値を削除する

Session["login_name"] = "";
Session.Remove("login_name");

● セッションを初期化する

Session.RemoveAll() 

https://msdn.microsoft.com/ja-jp/library/cc338759.aspx

● すべてのセッションの値を表示する(ダンプ)

            foreach (string key in Session.Keys)
            {
                Debug.WriteLine( key + " - " + Session[key].ToString() + "<br />"  );
            }

● NLogの内部ログ(Internal Log)を表示させる

NLog.Configに以下のように設定します

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      internalLogFile="C:\<あなたのプロジェクトディレクトリ>\internal.log"
      internalLogLevel="Trace"
      internalLogToConsole="true"
      internalLogToConsoleError="true"
      internalLogToTrace="true" >
No.1242
06/11 10:42

edit

.NET の ログクラス NLogを使用する

● NLogのインストール

NuGetからインストールします。 Visual Studioなら「ソリューションエクスプローラー」を右クリックして「NuGetパッケージの管理」から「NLog」を検索してインストールします

● NLogの使い方

  1. NLogを使いたいクラスにプロパティ logger をセットします。

         private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
    
  2. ログへ出力します

    logger.Info( "情報ログ" );
    logger.Debug( "デバッグログ" );
    logger.Trace( "トレースログ" );
    

● NLogのログレベル

ログにはレベルが存在します。レベルによって処理を分けたりするためです。
(エラーの時は別ファイルに保存したり、エラーの時はメールを送信したりといった感じです。)

(NLogのログレベル。上から順に需要)

  logger.Fatal("致命的レベル");
  logger.Error("エラーレベル");
  logger.Warn("警告レベル");
  logger.Info("情報レベル");
  logger.Debug("デバッグレベル");
  logger.Trace("トレースレベル");

● ログの設定

NLog.Config というファイルがインストール時に自動生成されます (自動生成されないこともあります。) その時は以下のようなファイル NLog.Config を プロジェクトのフォルダに作成します。

NLog.Config

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<targets>
  <target name="normal" 
          xsi:type="File" 
          encoding="UTF-8" 
          lineEnding="LF" 
          fileName="${basedir}/logs/event.log" 
          layout="[${longdate}] [${uppercase:${level:padding=5}}] ${callsite}() [${message}] ${exception:format=tostring}" 

          archiveNumbering="Date" 
          archiveFileName="${basedir}/logs/archive/{#}-event.log" 
          archiveEvery="Day" archiveDateFormat="yyyyMMdd" 
          maxArchiveFiles="7" />

    <target name="error" 
            xsi:type="File" 
            encoding="UTF-8" 
            lineEnding="LF" 
            layout="[${longdate}] [${uppercase:${level:padding=5}}] ${message} - ${callsite}() ${exception:format=tostring}" 
            fileName="${basedir}/logs/error.log" 
            archiveNumbering="Date" 
            archiveFileName="${basedir}/logs/archive/{#}-error.log" 
            archiveEvery="Day" archiveDateFormat="yyyyMMdd" 
            maxArchiveFiles="7"/>

</targets>

  <rules>
      <logger name="*" minlevel="Info" writeTo="normal" />
      <logger name="*" minlevel="Trace" writeTo="normal" />
      <logger name="*" levels="Error,Fatal" writeTo="error"/>
  </rules>

</nlog>

${basedir} というのが出てきますが、これは AppDomain.CurrentDomain.BaseDirectory の事です。
場所がわからない場合は次のようにして確認してみてください。

Debug.WriteLine( AppDomain.CurrentDomain.BaseDirectory );

● try catch で使用する

DB処理など try catch したい場合は次のように記述します

                try
                {
                    logger.Info( "DB処理 - 開始" );
                    // ここにDB処理
                    logger.Info( "DB処理 - 正常完了" );
                }
                catch (Exception ex)
                {
                    logger.Error( ex );
                    throw;
                }
No.1241
06/05 20:40

edit

.NET C# の try catch 例外エラー サンプル

.NET C# の try catch 例外エラー サンプル
スニペットとして登録しておいておくといいと思います。

            try
            {
                // Your code here ...
            }
            catch (Exception ex)
            {
                logger.Error( ex );
                Debug.WriteLine( "=======================================" );
                Debug.WriteLine( ex.Message );
                Debug.WriteLine( "=======================================" );
                Debug.WriteLine( ex.StackTrace );
                Debug.WriteLine( "=======================================" );
                Debug.WriteLine( "エラーが発生しました" );
                throw;
            }


No.1240
06/14 18:47

edit

SQL Server で 日付を整形する

FORMAT関数のほうがCONVERT 関数より使いやすいです

● format

SELECT FORMAT(GETDATE(),'yyyyMMdd')
      ,FORMAT(GETDATE(),'yyyy/MM/dd')
      ,FORMAT(GETDATE(),'yyyy/MM/dd HH:mm:ss')
-----------------------------------------------------
20180531
2018/05/31
2018/05/31 10:05:23

● convert

SELECT CONVERT (date, getdate()) 
            ,CONVERT(NVARCHAR, getdate(), 112)
-----------------------------------------------------
2018-05-31
20180531
No.1238
05/31 10:21

edit

VS codeの必須拡張

● ケースを変換 ( PascalCase → camelCase )

https://github.com/wmaurer/vscode-change-case

● = でコードを揃える「Code alignment」

https://marketplace.visualstudio.com/items?itemName=cpmcgrath.Codealignment

● デフォルトのカラーテーマの色を変更する

C:\Program Files\Microsoft VS Code\resources\app\extensions\theme-defaults\themes

を変更する

No.1237
05/31 21:38

edit

SQL Server の トランザクションとロック メモ

● A. トランザクションの分離レベル4種類

非コミット読み取り(READ UNCOMMITTED)
コミット済み読み取り(READ COMMITTED)
再読み込み可能読み取り(REPEATABLE READ)
直列化(SERIALIZABLE)

● A. トランザクションの分離レベル4種類をセットするSQL文

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

● B. トランザクションの開始と終了

・1. トランザクションの開始

トランザクションの開始を宣言します(これがないとロックしません)

BEGIN TRANSACTION

・2. トランザクションのコミット(トランザクション開始からCOMMITまでの処理をすべて実行します)

COMMIT

・3. トランザクションのロールバック(トランザクション開始からCOMMITまでの処理をすべてキャンセルします)

ROLLBACK TRANSACTION

● ロックのタイムアウト

・1. 現在のロックのタイムアウト時間を調べる

デフォルトのロックのタイムアウト時間を調べます

SELECT @@lock_timeout AS default_lock_timeout;

-1 の値が返ってきたときはタイムアウトしません(恐ろしい...)

・2. ロックのタイムアウト時間を設定する

ロックのタイムアウト時間を 30秒 に設定する

SET LOCK_TIMEOUT 30000 

msec で指定するので30秒にセットするときは 30000 になります。

● C. SELECT時に排他ロックをかける

排他ロックは通常 INSERTやUPDATEなどの更新処理のタイミングでかかりはじめます。 SELECTをする時からロックを開始したいときは明示的にロックをかけます

select max(ID) AS maxid from MY_TABLE WITH(XLOCK);

WHERE句が来るときは位置に注意

select * FROM MY_TABLE WITH(XLOCK) WHERE ID = 5 ;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
SELECT * FROM EV100TL
ROLLBACK TRANSACTION
No.1236
05/25 21:56

edit

Visual Studio 2017 を SublimeText ライクに操作する

● Visual Studio 2017 で Ctrl + D でマルチカーソルを扱えるようにする「SelectNextOccurrence」

https://github.com/2mas/SelectNextOccurrence

インストール後に「ツール」→「オプション」→「キーボード」からショートカットを登録すれば使えるようになります。

● Visual Studio 2017 で 縦の行間を変える「Line Press」

https://marketplace.visualstudio.com/items?itemName=OmarRwemi.LinePress

No.1235
05/25 10:32

edit

C# で 正規表現にマッチするかどうか判別しマッチした文字列を抜き出す

using System.Text.RegularExpressions;

matchedObject.Success の true または false でマッチしたかどうかを判別し、
マッチした文字列は matchedObject.Groups 配列から取り出します

string Url = "http://google.co.jp/";
Match matchedObject = Regex.Match(Url, @"https?://google(.+)");
if ( matchedObject.Success)
    {
        var country = matchedObject.Groups[1].Value;
    }
No.1234
05/24 22:31

edit

.NET Core 2 で Tweetinvi を使って Twitter API を叩く

.NET Core 2 でTwitter API を叩きたいときは Tweetinvi を使うといいでしょう。(CoreTweetではなく。)

● Tweetinvi パッケージのインストール

Visual Studio からパッケージを「Tweetinvi」で検索してインストールするか

Install-Package TweetinviAPI

コマンドでインストールします。

● 簡単な使い方

・ツイートする

Auth.SetUserCredentials("CONSUMER_KEY", "CONSUMER_SECRET", "ACCESS_TOKEN", "ACCESS_TOKEN_SECRET");
Tweet.PublishTweet("Hello World!");

(以降、Auth は省略します)

・ツイートIDからツイート情報を取得する

var status = Tweet.GetTweet(999226655250956288);
No.1233
05/24 21:04

edit

.NET C# の日付クラス DateTime

● 現在の日付の日付クラスを作成

DateTime date = DateTime.Now;

● 現在の日付を 任意のフォーマットで取得

DateTime dt = DateTime.Now;
var d1 = dt.ToString( "yyyyMMdd" );
var t1 = dt.ToString( "HHmmss" );
20180528
120559

● 任意の文字列から日付クラスを作成

var start_str = "20180215131723";
DateTime dt = DateTime.ParseExact(start_str, "yyyyMMddHHmmss", new CultureInfo("ja-JP"));

● 日付の比較

オブジェクト同士なら 比較演算子( > や = など)で比較できます
No.1232
05/30 16:24

edit

.NET Core の Entity Framework で直接SQL文を実行する

.NET Coreでは基本 Entity Framework を使用するので直接SQL文を実行する事はありませんが、たまにSQL文を実行したい時があります。 Entity Frameworkを使用するので簡単なSQL文を実行したいだけの時でも「モデル」と「コンテキスト」は定義しておく必要があります。

引用 : https://docs.microsoft.com/ja-jp/aspnet/core/data/ef-mvc/advanced?view=aspnetcore-2.0#raw-sql-queries

● SQL文を直接実行(エンティティを返す)

(DBコンテキスト : _context)(テーブル:MYTABLE) を操作します

string sql = "SELECT * FROM MYTABLE";
var result = _context.Mytable.FromSql(sql);

パラメータを渡したい場合は以下のように記述します

using System.Data.SqlClient;
var sp = new SqlParameter("nm", "tanaka");
var result = this.db.Ev100tl
    .FromSql("SELECT TOP 1 * FROM EV100TL WHERE NAME = @nm", sp);

● SQL文を直接実行

非クエリ コマンドに対して Database.ExecuteSqlCommand を使用します。

引用 : https://docs.microsoft.com/ja-jp/aspnet/core/data/ef-mvc/advanced?view=aspnetcore-2.0#raw-sql-queries

No.1231
05/25 15:08

edit

データファーストでモデルファイルを作成する

DBにテーブルを構築後モデルファイルを自動で生成するにはプロジェクトフォルダ( .sln ファイルがあるディレクトリの1つ下の階層)から PowerShell を立ち上げ、次のようにコマンドを入力します

dotnet ef dbcontext scaffold "Server=データベースサーバ名;Database=ScaffoldDB;Trusted_Connection=True" Microsoft.EntityFrameworkCore.SqlServer -o Models

例 :

DBサーバ : MYPC\SQLEXPRESS
データベース : MyDb

の場合

dotnet ef dbcontext scaffold "Server=MYPC\SQLEXPRESS;Database=MyDb;Trusted_Connection=True" Microsoft.EntityFrameworkCore.SqlServer -o Models

● すでにモデルファイルが生成済みなので上書きできないエラーが出る場合

-f オプションで上書きします。(一番最後に -f をつけて実行します)

dotnet ef dbcontext scaffold "Server=データベースサーバ名;Database=ScaffoldDB;Trusted_Connection=True" Microsoft.EntityFrameworkCore.SqlServer -o Models -f

● dotnet ef コマンドが使えない場合

1. .csproj ファイルの Project 配下に以下のコードを追加

<ItemGroup>
  <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
</ItemGroup>

2. コマンド

dotnet restore

を実行すると dotnet ef コマンドが使用できるようになります。

No.1230
05/31 17:26

edit

.Net core mvc で appsettings.json の設定をコントローラーから利用する

引用 : https://qiita.com/TsuyoshiUshio@github/items/f45700dc2e95e7c3992a

● appsettings.json ファイルに設定を書き込む

appsettings.json

  "MySettings": {
    "KEY": "hogehoge",
    "SECRET": "fugafuga",
  }

● モデルファイル AppSetting.cs を作成する

「Models」フォルダを右クリックして新しいクラスを作成します
appsettings.json の中身をすべてコピーして「編集」→「形式を選択して貼り付け」→「JSONをクラスとして張り付ける」を実行すると時間が短縮できます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace <あなたのプロジェクト名>.Models
{
    public class AppSettings
    {
        public Mysettings MySettings { get; set; }

        public class Mysettings
        {
            public string KEY{ get; set; }
            public string SECRET { get; set; }
        }

    }
}

● Startup.cs の書き換え

using <あなたのプロジェクト名>.Models;
using Microsoft.Extensions.Options;

を先頭に追加し、次のメソッドを書き換え

   public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.Configure<AppSettings>(Configuration);
        }

● コントローラー HomeController.cs の書き換え

using <あなたのプロジェクト名>.Models;
using Microsoft.Extensions.Options;

を先頭に追加し、次のプライベート変数とコンストラクタを追加

        private readonly AppSettings appSettings;

        public HomeController(IOptions<AppSettings> optionsAccessor)
        {
            this.appSettings = optionsAccessor.Value;
        }

以上でコントローラーの各メソッドで this.appSettings から appsettings.json の値が参照できます。

No.1229
05/24 09:29

edit

C#の命名規則

C#の命名規則について調べてみるとそこまで厳格には決められていない(例:プライベートメソッドは Camel ? または Pascal?) ので皆さんそれぞれ採用されているようですが

こちらの決め方がよいと思います
https://jikkenjo.net/309.html

privateなものはCamel
publicなものはPascal
静的な定数はPascal
インターフェイスのプレフィックスとして[I(大文字のアイ)]を付ける

プライベートメソッドは ... Pascal に一票(ここは宗教論争ですね)入れたいと思います。

参考 https://docs.microsoft.com/ja-jp/dotnet/standard/design-guidelines/naming-guidelines http://taka-say.hateblo.jp/entry/2014/05/26/005005

No.1228
05/23 19:20

edit

.NET core mvc の razorテンプレート

● Razorテンプレートへの値のセットとテンプレートでの表示

1. 値のセット

HogeController.cs

        public IActionResult Fuga()
        {
            ViewData["Message"] = "メッセージの表示テストです";
            return View();
        }

2. テンプレートでの表示

Fuga.cshtml

<h2>@ViewData["Title"]</h2>

3. ブラウザでの表示

デバッグを実行してブラウザのアドレス欄に http://localhost:50914/Hoge/Fuga と入力して移動すると

<h2>メッセージの表示テストです</h2>

が出力されます。

● RazorテンプレートからコントローラーへフォームのPOSTデータを渡す方法(1.ベタなやり方)

「Input」で渡した値を「Confirm」で受け取ってみます

Input.cshtml (入力画面)

    <form asp-controller="Hoge" asp-action="Confirm" method="post">
        @Html.AntiForgeryToken()
        <input type="text" name="Email" >
        <input type="text" name="Url" >
        <input type="submit" value="送信する">
    </form>

HogeController.cs (確認画面 - コントローラ)

        // POST: Hoge/Confirm
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Confirm(string Email, string Url)
        {
            ViewData["Email"] = Email;
            ViewData["Url"] = Url;
            return View();
        }

Confirm.cshtml(確認画面 - ビュー)

        <table>
            <tr>
                <td>Email</td>
                <td>@ViewData["Email"]</td>
            </tr>
            <tr>
                <td>Url</td>
                <td>@ViewData["Url"]</td>
            </tr>
        </table>

● RazorテンプレートからコントローラーへフォームのPOSTデータを渡す方法(2.スマートなやり方)

(1.)と同じく「Input」で渡した値を「Confirm」で受け取ってみます。
この時モデルを定義してモデルを受け渡します。

Input.cshtml (入力画面)

    <form asp-controller="Toukous" asp-action="Confirm" method="post">
        @Html.AntiForgeryToken()
        <input type="text" name="Email" >
        <input type="text" name="Url" >
        <input type="submit" value="送信する">
    </form>

Models/Hoge.cs(モデル)

namespace Hoge.Models
{
    public class Toukou
    {
        public int ID { get; set; }
        public string Email { get; set; }
        public string Url { get; set; }
    }
}

HogeController.cs (確認画面 - コントローラ) view()の引数で「テンプレートファイル」「モデル」を渡しています

        // POST: Hoge/Confirm
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Confirm(Toukou model)
        {
            return View("Confirm", model);
        }

Confirm.cshtml(確認画面 - ビュー) テンプレート cshtml の一番上でモデルのクラスを指定します。

@model <プロジェクト名>.Models.<モデルのクラス名>

@model Myapp.Models.Entry
        <table>
            <tr>
                <th>@Html.DisplayNameFor(model => model.Email)</th>
                <td>@Html.DisplayFor(model => model.Email)</td>
            </tr>
            <tr>
                <th>@Html.DisplayNameFor(model => model.Url)</th>
                <td>@Html.DisplayFor(model => model.Url)</td>
            </tr>
        </table>

● テンプレートのレイアウトファイル(継承元)

デフォルトではレイアウト(継承元)のテンプレートファイルは

Views/Shared/_Layout.cshtml

にあります。

これは /Views/_ViewStart.cshtml に次のように定義されているので

@{
    Layout = "_Layout";
}

レイアウトファイルを変えたい場合はここを変更します。
レイアウトを使用しない場合は null をセットします。

● ドキュメントルートの参照

チルダ ~ でドキュメントルートを参照できます。

<img src="~/Content/hoge.gif" alt="サンプル画像" />

参考 : http://blog.mamemaki.com/entry/2015/06/30/142450

No.1224
06/13 13:20

edit

.NET Core MVC モデルの追加とDBマイグレーション、コントローラー自動作成方法

コードファーストでDBとコントローラーを作成します。

● 1. モデルファイルの追加

「ソリューションエクスプローラー」→「/Models」を右クリック → 追加 → 「クラス」(モデルの名前を入力して「追加」)

● 2. モデル(DB定義)の記述

Movieクラスを作成した場合
/models/Movie.cs

    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
        public decimal Price { get; set; }
    }

● 3. DBマイグレーション

Visual Studioの「パッケージマネージャー コンソール」から

Add-Migration Initial
Update-Database

(または PowerShellから同様のコマンドを実行することができます。Mac、Unixの場合はこちら)

dotnet ef migrations add Initial
dotnet ef database update

● 4. コントローラーの自動生成

「ソリューションエクスプローラー」→「/Controllers」を右クリック → 追加 → 「コントローラー」 →「Entity Frameworkを利用したビューがあるMVCコントローラー」(モデルクラスを選択して「追加」)

● 5. 実行

「f5」でアプリを実行し
http://localhost:50914/Movies
へ移動し動作を確認する。

No.1225
05/23 22:10

edit

SQL Server へ 「SQL Server認証」でログインするユーザーを作成し .Net アプリのDB接続に使用する

SQL Serverへのログインはデフォルトでは Windows認証となっていますが、
ユーザーとパスワードをしていすればログインできる「SQL Server認証」でログインできるようにしてみます。

● 1. 「SQL Server認証」でログインするユーザーを登録する

Microsoft SQL ServerManagement Studio を起動して次のようにします。

「セキュリティ」→「ログイン」を右クリックして「新しいログイン」を選択する
・「ログイン名」を入力する
・「SQL Server認証」を選択する
・「パスワード」「パスワードの確認入力」を入力する
・「パスワードポリシーを適用する」のチェックを外す(簡単なパスワードを許可したい場合)
・「既定のデータベース」、使用したいデータベースを選択
・「既定の言語」、 Japanese を選択
・「ユーザーマッピング」ページへ移動し操作したいデータベースの横にある「マップ」のチェックボックスのチェックをつける
・操作したいデータベースを選択し、下の画面の「db_owner」にチェックをつける

● 2. DB全体の認証モードを変更する

1. モード認証を変更

サーバー名を右クリック → プロパティ → 「セキュリティ」を選択 →「SQL Server認証モードとWindows認証モード」を選択 → OK

2. SQL Server を再起動

SQL Server 構成マネージャー から SQL Server を再起動する

● 3. ログインの確認

Microsoft SQL ServerManagement Studio を起動して 「SQL Server認証」 を選択し先ほど入力したIDとパスワードでログインできることを確認する。

● 4. .NET アプリでの使用

SQLサーバ名 : WINSERVER2016\\SQLEXPRESS
データベース名 : testdb
ID : hogehoge
PASS : mypass

で接続するには appsettings.json に次のように記述します。

"ConnectionStrings": {
    "DefaultConnection": "Server=WINSERVER2016\\SQLEXPRESS;Initial Catalog=testdb;MultipleActiveResultSets=true;User ID=hogehoge;Password=mypass"
  },

引用 : https://stackoverflow.com/questions/42921947/adding-a-sql-connection-to-my-asp-net-core-application-how-to-define-connectio

No.1221
05/12 00:07

edit

.Net 本番機でのエラーを把握する

web.config を次のように書き換えます

<aspNetCore processPath="dotnet" arguments=".\TestLoginApp5.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
<aspNetCore processPath="dotnet" arguments=".\TestLoginApp5.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout">
	<environmentVariables>
	<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
	</environmentVariables>
</aspNetCore>

No.1220
05/11 17:02

edit

dotnet コマンド CLI

● dotnet ef(EntityFramework)データベース コマンド

# CLI版を使う際には追加パッケージをインストールします。
dotnet add package Microsoft.EntityFrameworkCore.Tools.DotNet

# Add-Migration 適当な名前
dotnet ef migrations add 適当な名前

# Remove-Migration
dotnet ef migrations remove

# Update-Database
dotnet ef database update

# Drop-Database
dotnet ef database drop

引用: EntityFrameworkCoreを.NET Core コンソールアプリでCodeFirstに使う - Qiita

No.1219
05/11 11:13

edit

.Net Core MVC で ユーザー認証のアプリを5分で作成する

● 1. Visual Studio 2017 から 新規プロジェクトを作成する

その際以下の認証機能を追加します

・メニューの「新規作成」→「プロジェクト」→「ASP .Net CORE MVCアプリケーション」で【OK】を押す。
・「Webアプリケーション(モデル ビューコントローラー)」「認証の変更」「個別のユーザーアカウント」を選択して【OK】を押す。

これでプロジェクトファイルとソースコード一式が生成されます。

● 2. 接続するデータベースの設定とデータベース名を変更する

appsettings.json の DB接続の項目を変更します。

appsettings.json

  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-TestLogin4-3FFC9AB5-5122-4BFD-9097-4F6113EE0EA3;Trusted_Connection=True;MultipleActiveResultSets=true"
  },

これの

"DefaultConnection": "Server=(localdb)\\mssqllocaldb;

DefaultConnectionを ローカルDBからSQL Server に変更します ↓

PCの名前が MYPCの場合

"DefaultConnection": "Server=MYPC\\SQLEXPRESS;

またデータベース名はデフォルトでは
aspnet-TestLogin4-3FFC9AB5-5122-4BFD-9097-4F6113EE0EA3 といった長い名前がつけられます。 これも好きな名前に変えておきます。

Database=aspnet-TestLogin4-3FFC9AB5-5122-4BFD-9097-4F6113EE0EA3;

↓ (データベース名を mydb に変更します)

Database=mydb;

● 3. データベースのマイグレーション

A. パッケージマネージャーコンソール を使用する場合

パッケージマネージャーコンソールから

Update-Database

と入力します。

B. PowerShellを使用する場合

PowerShellを開き、プロジェクトがあるディレクトリに移動してから

dotnet ef database update

と入力します。

以上です。

● 4. Visual Studio からビルドして実行する

ローカルで動作することを確認します

● 5. サーバに SQL Serverをインストールする

1. SQL Server 2017 Express をインストールする

(10GBまで無料の SQL Server 2017 Express をインストールします) https://www.microsoft.com/ja-jp/sql-server/sql-server-editions-express

2. SQL Server Management Studio をインストールする

https://go.microsoft.com/fwlink/?linkid=870039

No.1218
05/19 13:10

edit

Visual Studio からFTPを使って .Net Core MVC アプリを手動でデプロイする

● 1.Visual Studio から Webデプロイパッケージ を使用しアプリの zip ファイルを作成する

・ Visual Studio 2017 を立ち上げてアプリのプロジェクトファイルを開く

・ 「ソリューションエクスプローラー」のプロジェクトを右クリックして「発行」

・ 「設定」を押して発行方法「Webデプロイパッケージ」にして発行する。

指定したディレクトリに .zip ファイルが生成されます。

●2. デプロイするサーバー側に .NET CORE SDK をインストールする

https://www.microsoft.com/net/download/windows

●3. デプロイパッケージをインポートする

・FTPを使ってサーバへ .zip ファイルを送信する

・「インターネット インフォメーション サービス (IIS) マネージャー」の左のメニューからアプリを配置したいサイトを選択し「アプリケーションのインポート」を実行する

.zip ファイルや 発行先ディレクトリの入力を求められるので入力します。

●4. .Net Core MVC アプリを起動する

・まず dotnet コマンドを使って組み込みサーバで動作を確認する

PowerShellを立ち上げて、該当ディレクトリに移動した後で次のコマンドを入力 (例: アプリ名が HelloWorld01 の場合)

 dotnet HelloWorld01.dll

組み込みサーバが立ち上がるので表示されるアドレスを入力して動作を確認します。 (確認後 Press Ctrl+C でサーバを終了。)

・サイトのurlを入力してアクセスを確認する

以上です。 手動のデプロイも簡単です。

No.1215
05/09 11:57

edit

Windows PowerShell の起動の仕方とエイリアスの設定

● Windows PowerShell の起動の仕方

Explorer で該当ディレクトリに移動しアドレス欄に powershell と入力して実行すると、該当ディレクトリをカレントディレクトリとして立ち上がります

● bash の .bash_profile のように、Windows PowerShell のエイリアスを設定する

● 管理者権限でPowerShell を起動し、以下を実行する

Set-ExecutionPolicy RemoteSigned

● 普通にPowerShell を起動し、以下を実行する

New-item –type file –force $profile
notepad $profile

ファイルが開くのでエイリアスを追加して保存する

Set-Alias g git
Set-Alias l Get-ChildItem

PowerShell を再起動するとエイリアスが使えるようになっています。

No.1212
05/11 11:13

edit

Windowsサーバに open sshd をインストールして他のマシンからWindowsへssh接続できるようにする

● 1. Windows用 ssh をダウンロードする

https://github.com/PowerShell/Win32-OpenSSH/releases
(64bit版、32bit版どちらもあるのでお使いのサーバ用の zip ファイルをダウンロード)

● 2. 解凍して任意の場所に置く

c:\openssh\

に置きます。

● 3. 環境変数にパスを追加する

・「Windowsアイコンを右クリック」→「システム」をクリック
・「システムの詳細設定」→「環境変数」をクリック
・「システム環境変数」の 「Path」 を選択して「編集」をクリック。
・「追加」を押して「C:\openssh」を追加

● 4. sshサーバをインストール

Power Shellを起動して以下を実行します

cd \openssh
.\install-sshd.ps1
New-NetFirewallRule -Protocol TCP -LocalPort 22 -Direction Inbound -Action Allow -DisplayName SSH

● 5. sshサーバの自動起動をセット

Power Shellを起動して以下を実行します

Set-Service sshd -StartupType Automatic
Set-Service ssh-agent -StartupType Automatic

● 6. Windowsサーバを再起動

再起動後に他のマシンからssh接続を確認します。

No.1204
05/10 10:45

edit