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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

ASP.NET

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

Q&A

解決済

2回答

6187閲覧

textareaに正規表現で文字数、行数制限をかけたい

youkan_17

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

ASP.NET

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

0グッド

0クリップ

投稿2018/08/03 07:08

編集2018/08/03 07:12

###正規表現で文字数、行数制限をかけたいのですが上手くいきません。
初めての質問なので、内容に不備があったら申し訳ありません。

asp.net core2.0で開発をしています。
その中でビューのtextareaに文字数、行数制限をかけるために
RegularExpression属性で正規表現を使用して制限をかけようと
しているのですが、上手くいかない状況です。

具体的には1行に58文字、3行まで。という制限をかけたいです。

問題

1行に58文字、3行と最大文字数を入力すると、入力時はチェックがかからないのですが
更新時にチェックがかかります。
入力時と更新時の違いが分からずに行き詰っている状況です。

追記
1行に57文字、3行だと更新が可能です。
改行が含まれているせいかとは考えているのですが、正規表現がまだ馴れていないもので
いい方法が思いつきません。

ソースコード

Model

c#

1[RegularExpression("^(.{0,58})(\n.{0,58}|)(\n.{0,58}|)$")] 2public string hoge { get; set; }

Controller

c#

1if(!ModelState.IsValid){ 2 return View(viewModel); 3}

View

c#

1<div class="form-group"> 2 <label asp-for="hoge" class="control-label col-md-2"></label> 3 <div class="col-md-10"> 4 <textarea asp-for="hoge" class="form-control" rows="3"></textarea> 5 <span asp-validation-for="hoge" class="text-danger"></span> 6 </div> 7</div>

試したこと

調べながら正規表現チェックツールで色々試しているのですが、上手くいかない状況です。

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

Asp.Net Core2.0

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/08/03 07:24

質問者さんの言う「入力時」「更新時」とは何ですか? 前者がクライアントサイドでの JavaScript / jQyery での検証で、後者がサーバーサイドでモデルバインディングが行われる際の検証のことを言ってますか?
youkan_17

2018/08/03 07:34

申し訳ありません。Regularexpression属性を設定すれば入力チェックがかかるとしか理解しておらず、JavaScript/jQueryでの検証がかかっているかどうかが分かりません。タイミングでお答えすると「入力時」はtextareaに文字を入力してフォーカスを遷移させた時、「更新時」はサーバーサイドの検証のことです。
youkan_17

2018/08/03 07:37

もし情報が足りなければ、恐縮ですが教えて頂きたいです。
youkan_17

2018/08/03 07:42

調べてみた結果SurferOnWwwさんが仰っていることで間違いないと思います。
guest

回答2

0

ベストアンサー

質問者さんの言う「入力時」「更新時」とは、前者がクライアントサイドでの JavaScript / jQyery での検証、後者がサーバーサイドでモデルバインディングが行われる際の検証のことと理解してレスします。

あと、Core 2.0 には触ったこともないので、たぶん .NET Framework の MVC3 ~ MVC5 と同じであろうと想像してレスします。もし違っていたらすみません。

MVC3 以降ではクライアントサイドでの jQuery / jQuery ライブラリによる検証もデフォルトで実装されるようになっていますが、それが動くようにするには、自分が知る限りですが、以下のようにする必要があります。

(1) モデルのクラスのプロパティに適切なアノテーション属性を付与

(2) Html ヘルパーの EditorFor を利用

(3) 検証用の外部スクリプトファイルがダウンロードされるように設定

上記 (1) のアノテーション属性とは質問者さんのケースで言うと、

[RegularExpression("^(.{0,58})(\n.{0,58}|)(\n.{0,58}|)$")]

が該当します。他にも Required とか StringLength 他いろいろありますので調べてみたください。なお、上記の正規表現が質問者さんの目的に合っているかどうかまでは調べてませんので、それはまた別の質問としてスレッドを立てて聞いてください。

上記の (2) ですが、EditorFor から textarea がレンダリングされるようにするには、モデルのクラスのプロパティに [DataType(DataType.MultilineText)] を追加してください。

textarea に class="form-control" rows="3" という属性を追加する方法は以下の記事を参考にしてください。

EditorFor での属性の付与方法
http://surferonwww.info/BlogEngine/post/2018/02/23/how-to-pass-html-attributes-in-editorfor.aspx

上記 (3) については _Layout.cshtml を使っているのであれば、View の一番最後に以下を追加すれば良いと思います。(MVC5 のテンプレートを使って自動生成したプロジェクトの場合です。Core 2.0 では違うかもしれません)

@section Scripts { @Scripts.Render("~/bundles/jqueryval") }

上記によって以下の script 要素がレンダリングされます。Core 2.0 では違うかもしれませんが、そのあたりは質問者さんの方で調べてください。

<script src="/Scripts/jquery.validate.js"></script> <script src="/Scripts/jquery.validate.unobtrusive.js"></script>

投稿2018/08/03 08:47

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

namda

2018/08/03 08:55

結論から言えば改行コードをカウントするロジックは既存のアノテーション属性で対処するのは不可能じゃないですかね。
youkan_17

2018/08/03 09:11

SurferOnWwwさんご回答ありがとうございます。 まだ解決には至っていませんが、理解が深まりました。 とりあえずは現状のままにしておこうかと思います。
youkan_17

2018/08/03 09:13

namdaさんもコメントありあがとうございます。 ほぼ丸一日調べていたので、不可能とわかるだけでもありがたいです。
x_x

2018/08/03 09:17

\n が 更新時に \r\n になってるのでしょうか?
退会済みユーザー

退会済みユーザー

2018/08/03 10:03

> 結論から言えば改行コードをカウントするロジックは既存のアノテーション属性で対処するのは不可能じゃないですかね。 その根拠は? そう言うからにはきちんと理由(想像・推測でもいいですから詳しく)を述べるべきでは?
退会済みユーザー

退会済みユーザー

2018/08/03 10:07

> ほぼ丸一日調べていたので、不可能とわかるだけでもありがたいです。 諦めないで、他人の言葉に惑わされないで、別にスレッドを立てて JavaScript の正規表現の問題として聞いてはいかがですか?
namda

2018/08/03 10:31

いや理由は書いてるでしょ既存で提供しているアノテーション属性では改行コードをカウントしてくれる都合の良いものは無いので無理と言ってます。
退会済みユーザー

退会済みユーザー

2018/08/03 10:34

いや理由は書いてないですね。そもそもあなたの言う「既存で提供しているアノテーション属性」とは何? そこをはっきりさせてくださいな。namda さん、どの程度 ASP.NET MVC の経験・知識があるのですか?
namda

2018/08/03 11:04

SurferOnWwwさんのが詳しいと思ってこの回答にコメントしているのですよ? >いろいろありますので調べてみたください と使えるものが有るように言ってますが以下を見ると使えそうなモノが見つからなかったので独自実装しなければならないので既存のアノテーション属性では不可能では?としています。 https://msdn.microsoft.com/ja-jp/library/system.componentmodel.dataannotations(v=vs.110).aspx
namda

2018/08/03 11:09

そういう意味ですと全体的に不可能と取られるようなコメントは不適切です。ここは謝らせてほしいですね。 あくまでこのコメントは既存(RequiredやStringLength)などでは不可能では無いですか?という意味に捉えていただければと思います。
退会済みユーザー

退会済みユーザー

2018/08/03 11:27

> あくまでこのコメントは既存(RequiredやStringLength)などでは不可能では無いですか?という意味に捉えていただければと思います。 質問と回答を読んでもらえばわかると思うのですが、このスレッドで質問者さんが使っているのは RegularExpression です。それはもちろん既存で、その話をしています。 私のレスは、 > 他にも Required とか StringLength 他いろいろありますので調べてみたください。 と言ったのですが、それのどこをどう読むと RegularExpression に代えて「既存(RequiredやStringLength)」を使うという話になるのですか?
退会済みユーザー

退会済みユーザー

2018/08/03 11:51

ひょっとして Required とか StringLength を使うと RegularExpression は使えないと思ってません? そんなことはないですよ。組み合わせて使えます。 実際、必須入力は Required でないと検出できないので、それと StringLength や RegularExpression を組み合わせて使うことが一般的です。
youkan_17

2018/08/03 12:50 編集

x_xさんコメントありがとうございます。 ¥r¥nの線も疑って試行錯誤してみたのですが、関係無さそうでした。 お二人ともありがとうございます。 今後の為にもJavaScriptの正規表現について質問してみます。
namda

2018/08/03 15:24

SurferOnWwwさん 落ち着いて考えてください。 組み合わせて使ったとして既存のものだけで「1行に58文字、3行」までを実装できますか? 少なくても私は提供されてるリファレンスを見てそれは不可能では?と考えコメントしました。 もし有効な組み合わせをお持ちであるならば試さず回答すべきでは無いでしょうか。 またyoukan_17さん置いてきぼりで申し訳ないです。
退会済みユーザー

退会済みユーザー

2018/08/03 15:33

話が通じてないです。上の回答で、 > 上記の正規表現が質問者さんの目的に合っているかどうかまでは調べてませんので、それはまた別の質問としてスレッドを立てて聞いてください。 とお願いした通り、質問者さんは別のスレッドを立てて質問中です。あなたはそちらで回答してあげては?
namda

2018/08/03 16:11

SurferOnWwwさん 話が通じないというか話をズラされてますが 私は一貫して「改行コードをカウントするロジックは既存のアノテーション属性で対処するのは不可能では?」 というスタンスです。 有るのなら掲示していただけたら大変助かると思うのですが。 また正規表現を否定するようなニュアンスは含んでいるとお思いならばそれは誤解ですのでご容赦ねがいます。
退会済みユーザー

退会済みユーザー

2018/08/03 16:27

> 私は一貫して「改行コードをカウントするロジックは既存のアノテーション属性で対処するのは不可能では?」というスタンスです。 あなたの「スタンス」は間違いです。不可能ではありません。RegularExpresson の場合は JavaScript と C# での正規表現の問題です。質問者さんが立てた別スレッドに書いてあるように、JavaScript では質問者さんが望む結果が得られてます(C# は一文字少なくなってしまうという問題が未解決のようですが)。 ここでのあなたとの話は不毛&意味がないので終わりにします。悪しからず。
退会済みユーザー

退会済みユーザー

2018/08/06 00:46

誰、マイナス評価をしたのは? 理由を書くならともかく、黙ってやるのは卑怯者だよ。理由にならん理由でも書かないよりは∞マシ。
guest

0

正規表現で難しい場合、カスタムバリデーションクラスを作り、自作のアノテーション属性を作ることで回避することができます。
この場合文字列から改行コードで分割し1行分が規定文字以下で有ること、改行コードが3つ以内であることと普通のコードで書けると思います。

実機が無いので動くものは提供できませんが以下が参考になると思います。

方法 : データ モデルでカスタム属性を使用してデータ フィールドの検証をカスタマイズする

投稿2018/08/03 16:49

namda

総合スコア705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/08/04 01:59

カスタムバリデーションクラスを作るほど難しくはなさそうで、正規表現を工夫すれば RegularExpression で対応できるはずです。質問者さんが立てた別スレッド参照。 紹介した記事は ASP.NET Dynamic Data のもので、ASP.NET MVC のものではありません。その記事のどこが参考になるのでしょう?
namda

2018/08/06 02:15

これは失礼しました。解決できそうでよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問