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

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

新規登録して質問してみよう
ただいま回答率
86.12%
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を利用して開発を行うことが可能です。

解決済

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

Eltk
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を利用して開発を行うことが可能です。

1回答

0リアクション

0クリップ

4968閲覧

投稿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

@ModelType MyTwitter.MyTwitter.Tweet @Code ViewData("Title") = "Create" End Code @Styles.Render("~/Content/Tweet/create.css") <h2>新規投稿</h2> @Using (Html.BeginForm("Create", "Tweets", FormMethod.Post, New With {.enctype = "multipart/form-data"})) @Html.AntiForgeryToken() @<div class="form-horizontal"> <hr /> @Html.ValidationSummary(True, "", New With {.class = "text-danger"}) <div class="form-group"> @Html.LabelFor(Function(model) model.Text, htmlAttributes:=New With {.class = "control-label col-md-2"}) <div class="col-md-10"> @Html.EditorFor(Function(model) model.Text, New With {.htmlAttributes = New With {.class = "form-control", .maxlength = "70", .rows = "4", .placeholder = "いまどうしてる?"}}) @Html.ValidationMessageFor(Function(model) model.Text, "", New With {.class = "text-danger"}) <div class="select-picture"> <i class="far fa-images"></i> @Html.HiddenFor(Function(model) model.Image, New With {.htmlAttributes = New With {.class = "form-control"}}) </div> </div> </div> <div Class="form-group"> @Html.LabelFor(Function(model) model.UserId, htmlAttributes:=New With {.class = "control-label col-md-2"}) <div class="col-md-10"> @Html.EditorFor(Function(model) model.UserId, New With {.htmlAttributes = New With {.class = "form-control"}}) @Html.ValidationMessageFor(Function(model) model.UserId, "", New With {.class = "text-danger"}) </div> </div> <input type="file" name="fl" value="" /> @ViewData("msg") <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="ツイートする" class="btn btn-default" /> </div> </div> </div> End Using <div> @Html.ActionLink("ホームに戻る", "Index") </div>

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

VisualBasic

Imports System Imports System.ComponentModel Imports System.ComponentModel.DataAnnotations Namespace MyTwitter Public Class Tweet Public Property Id As Integer <DisplayName("本文")> <DataType(DataType.MultilineText)> Public Property Text As String Public Property Image As Byte Public Property CreatedAt As DateTime Public Property UpdatedAt As DateTime Public Property UserId As Integer End Class End Namespace

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

VisualBasic

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

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

VisualBasic

Imports System Imports System.Collections.Generic Imports System.Data Imports System.Data.Entity Imports System.Linq Imports System.Net Imports System.Web Imports System.Web.Mvc Imports System.IO Imports MyTwitter.MyTwitter Namespace Controllers Public Class TweetsController Inherits System.Web.Mvc.Controller Private db As New MyTwitterContext ' GET: Tweets Function Index() As ActionResult Return View(db.Tweets.ToList()) End Function ' GET: Tweets/Create Function Create() As ActionResult Return View() End Function ' POST: Tweets/Create '過多ポスティング攻撃を防止するには、バインド先とする特定のプロパティを有効にしてください。 '詳細については、https://go.microsoft.com/fwlink/?LinkId=317598 を参照してください。 <HttpPost()> <ValidateAntiForgeryToken()> Function Create(<Bind(Include:="Text,Image,CreatedAt,UpdatedAt,UserId")> ByVal tweet As Tweet, ByVal fl As HttpPostedFileBase) As ActionResult ' コンテンツ・タイプが"image/*"であるか(画像ファイルか) ' をチェック If fl.ContentType.StartsWith("image/") Then ' アップロード先のパスを生成 Dim upfile As String = Server.MapPath("~/App_Data/Photos/") & Path.GetFileName(fl.FileName) ' 同名のファイルが存在する場合はエラー If System.IO.File.Exists(upfile) Then ViewData("msg") = "同名のファイルが存在します。" Else ' EDMのコンテキスト・オブジェクトを生成 'Dim _db As New MyMvcEntities() Dim _db As New MyMvcContext() ' エンティティにアップロード・ファイルの情報をセット Dim ph As New Tweet() 'ph.Name = Path.GetFileName(fl.FileName) ' ファイル名 'ph.Mime = fl.ContentType ' コンテンツ・タイプ Dim data(fl.ContentLength) As Byte fl.InputStream.Read(data, 0, fl.ContentLength) 'Dim text As String = data.ToString Dim text As String = System.Text.Encoding.UTF8.GetString(data) ph.Image = text ' データ本体 ' エンティティを追加&データソースに反映 _db.Tweets.Add(ph) _db.SaveChanges() ' 画像ファイルで同名のファイルが存在しない場合は保存処理 'fl.SaveAs(upfile) ViewData("msg") = String.Format("{0}をアップロードしました。", fl.FileName) End If Else ' 画像ファイルでない場合はエラー ViewData("msg") = "画像以外はアップロードできません。" End If If ModelState.IsValid Then db.Tweets.Add(New Tweet With { .Text = tweet.Text, .CreatedAt = DateTime.Now, .UpdatedAt = DateTime.Now, .UserId = tweet.UserId }) db.SaveChanges() ' 入力元のフォームに結果を表示 Return RedirectToAction("Index") Else Return View(tweet) End If End Function End Class End 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以降になります。
※休日の返信は不定期です。
申し訳ございませんが、どうぞよろしくお願いします。

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

適切な質問に修正を依頼しましょう。

SurferOnWww

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を選択し、修正いたしました。
SurferOnWww

2020/07/05 09:43

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

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に変えることで、質問タイトルの件は解決できました。 ありがとうございます。 同時にまた別のエラーが発生しておりますが、質問タイトルの内容からは派生してしまいますので、 いったん自身でエラー解決を試み、解決できなかった場合は、再度この質問に結びつける形で、質問させていただければと思います。 自己解決ではないですが、クローズしたいのですが、この場合どのように対応させていただいたらよろしいでしょうか。
SurferOnWww

2020/07/05 11:16

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

2020/07/05 11:21

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

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

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を利用して開発を行うことが可能です。