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

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

新規登録して質問してみよう
ただいま回答率
85.44%
ASP.NET

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

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

10985閲覧

System.InvalidCastExceptionのエラーが解決できません。

Eltk

総合スコア51

ASP.NET

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

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/07/05 07:39

編集2020/07/05 10:36

前提・実現したいこと

学習用で簡易版のTwitterみたいなものを作ろうとしているところで、
現在、ファイルアップロード機能と、DBへの保存処理を実装中です。
表題のエラーが発生しており、色々とネットで調べたりしてるのですが、
エラーの種類が変わったりするものの、なかなか解決できず、質問させていただいております。

流れとしましては、
「新規投稿」画面(Create.vbhtml)で、
・投稿内容(Text)
・画像(ファイルアップロードにより)(Image)
・ユーザーID(今は手入力しますが、後に自動取得させる予定)(UserId)
をフォーム入力後、
「ツイートする」ボタン押下で、DBに保存し、投稿一覧画面にリダイレクトさせる想定です。

※提供情報に不足があれば、ご指摘いただけると助かります。

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

コントローラーファイルの 「ph.Image = text ' データ本体」の行に、 「System.InvalidCastException」 のエラーが発生しております。 エラー文の中に文字化けのようなものも含まれておりますので、 添付画像で詳細をご確認お願いいたします。

該当のソースコード

※Viewファイル(Create.vbhtml)
※コードの途中にfontawesomeのアイコンが入っておりますが、将来的にアイコンクリックでファイルアップロード機能を持たせる予定で、
今はまだ使用しておりません。

VisualBasic

1@ModelType MyTwitter.MyTwitter.Tweet 2@Code 3 ViewData("Title") = "Create" 4End Code 5 6@Styles.Render("~/Content/Tweet/create.css") 7 8<h2>新規投稿</h2> 9 10@Using (Html.BeginForm("Create", "Tweets", FormMethod.Post, New With {.enctype = "multipart/form-data"})) 11 @Html.AntiForgeryToken() 12 13 @<div class="form-horizontal"> 14 <hr /> 15 @Html.ValidationSummary(True, "", New With {.class = "text-danger"}) 16 <div class="form-group"> 17 @Html.LabelFor(Function(model) model.Text, htmlAttributes:=New With {.class = "control-label col-md-2"}) 18 <div class="col-md-10"> 19 @Html.EditorFor(Function(model) model.Text, New With {.htmlAttributes = New With {.class = "form-control", .maxlength = "70", .rows = "4", .placeholder = "いまどうしてる?"}}) 20 @Html.ValidationMessageFor(Function(model) model.Text, "", New With {.class = "text-danger"}) 21 <div class="select-picture"> 22 <i class="far fa-images"></i> 23 @Html.HiddenFor(Function(model) model.Image, New With {.htmlAttributes = New With {.class = "form-control"}}) 24 </div> 25 </div> 26 </div> 27 28 <div Class="form-group"> 29 @Html.LabelFor(Function(model) model.UserId, htmlAttributes:=New With {.class = "control-label col-md-2"}) 30 <div class="col-md-10"> 31 @Html.EditorFor(Function(model) model.UserId, New With {.htmlAttributes = New With {.class = "form-control"}}) 32 @Html.ValidationMessageFor(Function(model) model.UserId, "", New With {.class = "text-danger"}) 33 </div> 34 </div> 35 36 <input type="file" name="fl" value="" /> 37 @ViewData("msg") 38 39 <div class="form-group"> 40 <div class="col-md-offset-2 col-md-10"> 41 <input type="submit" value="ツイートする" class="btn btn-default" /> 42 </div> 43 </div> 44</div> 45End Using 46 47<div> 48 @Html.ActionLink("ホームに戻る", "Index") 49</div>

※モデルファイル(Tweet.vb)

VisualBasic

1Imports System 2Imports System.ComponentModel 3Imports System.ComponentModel.DataAnnotations 4 5Namespace MyTwitter 6 7 Public Class Tweet 8 9 Public Property Id As Integer 10 11 <DisplayName("本文")> 12 <DataType(DataType.MultilineText)> 13 Public Property Text As String 14 15 Public Property Image As Byte 16 17 Public Property CreatedAt As DateTime 18 19 Public Property UpdatedAt As DateTime 20 21 Public Property UserId As Integer 22 23 End Class 24 25End Namespace

※コンテキストクラス(MyMvcContext.vb)

VisualBasic

1Imports System.Data.Entity 2Imports MyTwitter.MyTwitter 3 4Public Class MyMvcContext : Inherits DbContext 5 Public Property Tweets As DbSet(Of Tweet) ' Tweetsテーブル 6End Class

※コントローラ(TweetsController.vb)

VisualBasic

1Imports System 2Imports System.Collections.Generic 3Imports System.Data 4Imports System.Data.Entity 5Imports System.Linq 6Imports System.Net 7Imports System.Web 8Imports System.Web.Mvc 9Imports System.IO 10Imports MyTwitter.MyTwitter 11 12Namespace Controllers 13 Public Class TweetsController 14 Inherits System.Web.Mvc.Controller 15 16 Private db As New MyTwitterContext 17 18 ' GET: Tweets 19 Function Index() As ActionResult 20 Return View(db.Tweets.ToList()) 21 End Function 22 23 ' GET: Tweets/Create 24 Function Create() As ActionResult 25 Return View() 26 End Function 27 28 ' POST: Tweets/Create 29 '過多ポスティング攻撃を防止するには、バインド先とする特定のプロパティを有効にしてください。 30 '詳細については、https://go.microsoft.com/fwlink/?LinkId=317598 を参照してください。 31 <HttpPost()> 32 <ValidateAntiForgeryToken()> 33 Function Create(<Bind(Include:="Text,Image,CreatedAt,UpdatedAt,UserId")> ByVal tweet As Tweet, ByVal fl As HttpPostedFileBase) As ActionResult 34 35 ' コンテンツ・タイプが"image/*"であるか(画像ファイルか) 36 ' をチェック 37 If fl.ContentType.StartsWith("image/") Then 38 39 ' アップロード先のパスを生成 40 Dim upfile As String = Server.MapPath("~/App_Data/Photos/") & Path.GetFileName(fl.FileName) 41 42 ' 同名のファイルが存在する場合はエラー 43 If System.IO.File.Exists(upfile) Then 44 ViewData("msg") = "同名のファイルが存在します。" 45 Else 46 47 48 ' EDMのコンテキスト・オブジェクトを生成 49 'Dim _db As New MyMvcEntities() 50 Dim _db As New MyMvcContext() 51 52 ' エンティティにアップロード・ファイルの情報をセット 53 Dim ph As New Tweet() 54 'ph.Name = Path.GetFileName(fl.FileName) ' ファイル名 55 'ph.Mime = fl.ContentType ' コンテンツ・タイプ 56 57 Dim data(fl.ContentLength) As Byte 58 fl.InputStream.Read(data, 0, fl.ContentLength) 59 'Dim text As String = data.ToString 60 Dim text As String = System.Text.Encoding.UTF8.GetString(data) 61 ph.Image = text ' データ本体 62 63 ' エンティティを追加&データソースに反映 64 _db.Tweets.Add(ph) 65 _db.SaveChanges() 66 67 68 69 ' 画像ファイルで同名のファイルが存在しない場合は保存処理 70 'fl.SaveAs(upfile) 71 ViewData("msg") = String.Format("{0}をアップロードしました。", fl.FileName) 72 73 74 End If 75 Else 76 ' 画像ファイルでない場合はエラー 77 ViewData("msg") = "画像以外はアップロードできません。" 78 End If 79 80 81 If ModelState.IsValid Then 82 db.Tweets.Add(New Tweet With { 83 .Text = tweet.Text, 84 .CreatedAt = DateTime.Now, 85 .UpdatedAt = DateTime.Now, 86 .UserId = tweet.UserId 87 }) 88 89 db.SaveChanges() 90 91 92 ' 入力元のフォームに結果を表示 93 Return RedirectToAction("Index") 94 Else 95 Return View(tweet) 96 End If 97 98 End Function 99 100 End Class 101End Namespace

試したこと

以下の記事を参考にしました。
ファイルアップロード、およびデータベースへの保存機能につきましては、以下の2つを参考にしました。

■ファイルアップロード
https://www.atmarkit.co.jp/fdotnet/dotnettips/935aspmvcfileupload1/aspmvcfileupload1.html

■データベースへの保存
https://www.atmarkit.co.jp/fdotnet/dotnettips/939aspmvcfileupload2/aspmvcfileupload2.html

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

エラー内容画像
イメージ説明

統合開発環境
Visual Studio2019
(言語:VB.NET、プロジェクトテンプレート:ASP.NET Webアプリケーション MVC)

MVCフレームワークのバージョン
5.2.7

使用PC
Windows10

※平日は仕事のため、返信が19:30以降になります。
※休日の返信は不定期です。
申し訳ございませんが、どうぞよろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/07/05 08:07

タグが ASP.NET MVC 4 になってますが .NET Framework ベースの MVC4 に間違いないですか? 今時、MVC4 というのは間違い(タグの付け間違いでなければ選択の間違い)であろうと思っていますが。
Eltk

2020/07/05 08:34

>SurferOnWww様 間違いでした。失礼しました。 確認しましたところ、MVCのバージョンは5.2.7 となっておりました。 タグの選択肢にMVC5が無かったため、ASP.NET MVC Frameworkを選択し、修正いたしました。
退会済みユーザー

退会済みユーザー

2020/07/05 09:43

個人的なお願いで恐縮ですが ASP.NET のタグもつけていただけるとありがたいです。ASP.NET の方はよく見ているので。
退会済みユーザー

退会済みユーザー

2020/07/05 10:13 編集

コントローラーのコードの ph.Image = text で「入力文字列の形式が正しくありません」というエラーになるのが問題ということですか?  Tweet クラスの Image プロパティの定義は Public Property Image As Byte で、それに代入する text というのは文字列なので当たり前にそういうエラーになると思うのですが? そこだけ見ただけですが、基本的な文法が分かってなような気します。そういう基本のキのところに問題がないか全体的に見直していただけませんか? そうしてもらえないと話をしても発散するばかりのような気がします。
Eltk

2020/07/05 10:51 編集

>SurferOnWww様 タグ付けの件、ASP.NETでも追加完了しました。 問題としては、「ファイルアップロード後、ツイートするボタンを押下した後に保存処理がされず、エラーになってしまう」ことだったのですが、 エラーが色々出て、その度に色々なコードをエラー解消のため変えていた結果、Imageプロパティの型と異なっている点に気づいておりませんでした。 データ型をStringに変えることで、質問タイトルの件は解決できました。 ありがとうございます。 同時にまた別のエラーが発生しておりますが、質問タイトルの内容からは派生してしまいますので、 いったん自身でエラー解決を試み、解決できなかった場合は、再度この質問に結びつける形で、質問させていただければと思います。 自己解決ではないですが、クローズしたいのですが、この場合どのように対応させていただいたらよろしいでしょうか。
退会済みユーザー

退会済みユーザー

2020/07/05 11:16

> クローズしたいのですが、この場合どのように対応させていただいたらよろしいでしょうか。 回答欄に解決した方法を書いて、それで解決したとしてクローズしてください。 次回質問する機会があったら、今回のような基本のキのところに問題がないか全体的によ~く見直してから質問してください。訳が分からないまま混乱・迷走して、山ほど関係ないことを書いて、質問するようなことは次回は絶対ないようにしていただきたく。
Eltk

2020/07/05 11:21

>SurferOnWww様 かしこまりました。 なるべく迷走する前に、質問投稿するなりして、後手後手にまわらないように気をつけます。 教えていただいた方法でクローズいたします。 ありがとうございます。
guest

回答1

0

自己解決

モデルファイルのImageプロパティの型がString型になっていなかったために、発生していたエラーでした。
表題の件につきましては、この方法で解決しましたので、クローズさせていただきます。

投稿2020/07/05 11:22

Eltk

総合スコア51

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

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

退会済みユーザー

退会済みユーザー

2020/07/06 01:51

質問を見ると、根本的にダメな点が多々あって期待通りにはいくはずがないところに、上手くいかないからよく分からないまま色々いじくり回して、余計に事態が悪化して手に負えなくなって、訳が分からないままのコードを丸投げして質問したというように感じます。 そうだとすると、それは絶対に NG です。 本質的な問題を解決できるように質問しないと、回答者と閲覧者の時間と労力を無駄にするだけでなく、質問者さんにとってもメリットはないはずです。質問のコメント欄で「同時にまた別のエラーが発生」と言っているように別の問題が次々に出て迷走するだけでは? 参考にしている @IT の記事は、(1) ブラウザからクライアントのファイルをアップロードし(前者の記事)、(2) サーバー側ではアップロードされてきたファイル情報からファイル名とコンテンツタイプを取得し本体共に DB に保存(後者の記事)・・・ということですよね。 今回のスレッドの課題は、@IT の記事にない追加情報も (1) の時に一緒に送信して、それを (2) でファイルと一緒に DB に保存したいということですよね? であれば、次回質問する際は、質問文の最初の方の目立つところにそのように書いてください。そして、@IT の記事の通りになら問題なくできているのかも書いてください。話はそこからスタートすべきです。 そして、手に負えない問題があるのなら、@IT の記事に戻って、そこからあなたが「@IT の記事にはない追加情報も (1) の時に一緒に送信」するのにどうすればよいと考えたのかを説明するようにしてください。いろいろいじくり回して訳が分からなくなったコードを投げるのではなく。
Eltk

2020/07/06 11:43

>SurferOnWww様 >上手くいかないからよく分からないまま色々いじくり回して、余計に事態が悪化して手に負えなくなって、訳が分からないままのコードを丸投げして質問したというように感じます。 →確かに、エラーが発生するので、エラーメッセージを調べて、その解決法でエラーが消えれば良しとして次に進んでいますが、よくわかっていません。何がわかればわかるようになるのかもわからないことが多いです。 エラーを消してもエラーが続くときは、進んでいるのか事態が悪化しているのかもわかっておらず、ついにエラーが解決できなくなったら質問するという流れです。 おっしゃるように、ファイルアップロードの記事はいくつかネットでも見受けられましたが、それらをDBに保存する方法、その際のモデルファイルのプロパティの定義の型、他の追加情報と一緒に送信する方法がわからず、ファイルアップロード実装のためのコードをどう活用すれば良いのか、わからないまま色々試してみたという状態です。 一度、ファイルアップロードのみの機能実装も別のプロジェクトを作って試してみます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問