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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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回答

1511閲覧

新規登録(Create)ページからデータ登録後、登録内容が反映された状態で直接、編集(Edit)ページに遷移したい

Eltk

総合スコア51

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/06/08 14:44

編集2020/06/09 11:58

前提・実現したいこと

タイトルにも書かせていただいているのですが、
①新規登録ページで、フォームの内容を登録
②登録後に、(普通なら一覧ページ(Index.vbhtml)に遷移するところを)編集ページ(Edit.vbhtml)へ遷移し、
かつ、登録した内容も反映(既に各フォームに入力されている)状態にしたい。

※下記のモデルファイルで定義している、複合主キーである「id」と「itemId」の2つを手がかりに、新規登録後、
DBから、登録直後のレコードを取得したいのですが、その部分でエラーが発生してしまいます。

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

コントローラファイルの
「Dim test As Test = db.Tests.Where(Function(data) data.id = id).Where(Function(data) data.itemId = itemId)」
の箇所で以下のエラーが発生

'System.Data.Entity.Infrastructure.DbQuery`1[MvcApp.Test]' のオブジェクトを型 'MvcApp.Test' にキャストできません。'

その後、同じ箇所を
「Dim test As Test = CType(db.Tests.Where(Function(data) data.CampaignId = id).Where(Function(data) data.CampeignName = CampaignName), DbQuery)」
と修正してみるも、

'DbQuery' の値を 'Test' に変換できません。

というエラーが発生したため、いったん元の状態に戻しました。

該当のソースコード

Test.vb(モデルファイル)

VisualBasic

1Imports System.ComponentModel.DataAnnotations 2Imports System.ComponentModel 3 4Public Class Test 5 6 <Key()> 7 <DisplayName("テストID")> 8 Public Property Id As String 9 10 <DisplayName("テスト名")> 11 Public Property Name As String 12 13 <Key()> 14 <DisplayName("商品ID")> 15 Public Property itemId As String 16 17 <DisplayName("商品名")> 18 Public Property itemName As String 19 20End Class

MyMVCContext.vb(コンテキストファイル)

VisualBasic

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

Create.vb.html(新規登録画面のファイル)

VisualBasic

1@ModelType MvcApp.Test 2@Code 3 ViewData("Title") = "Create" 4End Code 5 6<h2>Create</h2> 7 8@Using (Html.BeginForm()) 9 @Html.AntiForgeryToken() 10 11 @<div class="form-horizontal"> 12 <h4>Test</h4> 13 <hr /> 14 @Html.ValidationSummary(True, "", New With {.class = "text-danger"}) 15 <div class="form-group"> 16 @Html.LabelFor(Function(model) model.id, htmlAttributes:=New With {.class = "control-label col-md-2"}) 17 <div class="col-md-10"> 18 @Html.EditorFor(Function(model) model.id, New With {.htmlAttributes = New With {.class = "form-control"}}) 19 @Html.ValidationMessageFor(Function(model) model.id, "", New With {.class = "text-danger"}) 20 </div> 21 </div> 22 23 <div class="form-group"> 24 @Html.LabelFor(Function(model) model.Name, htmlAttributes:=New With {.class = "control-label col-md-2"}) 25 <div class="col-md-10"> 26 @Html.EditorFor(Function(model) model.Name, New With {.htmlAttributes = New With {.class = "form-control"}}) 27 @Html.ValidationMessageFor(Function(model) model.Name, "", New With {.class = "text-danger"}) 28 </div> 29 </div> 30 31 <div class="form-group"> 32 @Html.LabelFor(Function(model) model.itemId, htmlAttributes:=New With {.class = "control-label col-md-2"}) 33 <div class="col-md-10"> 34 @Html.EditorFor(Function(model) model.itemId, New With {.htmlAttributes = New With {.class = "form-control"}}) 35 @Html.ValidationMessageFor(Function(model) model.itemId, "", New With {.class = "text-danger"}) 36 </div> 37 </div> 38 39 <div class="form-group"> 40 @Html.LabelFor(Function(model) model.itemName, htmlAttributes:=New With {.class = "control-label col-md-2"}) 41 <div class="col-md-10"> 42 @Html.EditorFor(Function(model) model.itemName, New With {.htmlAttributes = New With {.class = "form-control"}}) 43 @Html.ValidationMessageFor(Function(model) model.itemName, "", New With {.class = "text-danger"}) 44 </div> 45 </div> 46 47 <div class="form-group"> 48 <div class="col-md-offset-2 col-md-10"> 49 <input type="submit" value="Create" class="btn btn-default" /> 50 </div> 51 </div> 52</div> 53End Using 54 55<div> 56 @Html.ActionLink("Back to List", "Index") 57</div> 58 59@Section Scripts 60 @Scripts.Render("~/bundles/jqueryval") 61End Section

※TestsController.vb(コントローラのファイル)

VisualBasic

1Imports System 2Imports System.Collections.Generic 3Imports System.Data 4Imports System.Data.Entity 5Imports System.Data.Entity.Infrastructure 6Imports System.Linq 7Imports System.Net 8Imports System.Web 9Imports System.Web.Mvc 10Imports MvcApp 11 12Namespace Controllers 13 Public Class TestsController 14 Inherits System.Web.Mvc.Controller 15 16 Private db As New MyMvcContext 17 18 ' GET: Tests 19 Function Index() As ActionResult 20 Return View(db.Tests.ToList()) 21 End Function 22 23 ' GET: Tests/Create 24 Function Create() As ActionResult 25 Return View() 26 End Function 27 28 ' POST: Tests/Create 29 '過多ポスティング攻撃を防止するには、バインド先とする特定のプロパティを有効にしてください。 30 '詳細については、https://go.microsoft.com/fwlink/?LinkId=317598 を参照してください。 31 <HttpPost()> 32 <ValidateAntiForgeryToken()> 33 Function Create(<Bind(Include:="id,Name,itemId,itemName")> ByVal test As Test) As ActionResult 34 If ModelState.IsValid Then 35 db.Tests.Add(test) 36 db.SaveChanges() 37 38 TempData("id") = test.id 39 TempData("itemId") = test.itemId 40 Return RedirectToAction("Edit") 41 End If 42 Return View(test) 43 End Function 44 45 ' GET: Tests/Edit/5 46 Function Edit(ByVal id As String, ByVal itemId As String) As ActionResult 47 id = TempData("id") 48 itemId = TempData("itemId") 49 If IsNothing(id) Then 50 Return New HttpStatusCodeResult(HttpStatusCode.BadRequest) 51 End If 52 Dim test As Test = db.Tests.Where(Function(data) data.id = id).Where(Function(data) data.itemId = itemId) 53 54 If IsNothing(Test) Then 55 Return HttpNotFound() 56 End If 57 Return View(Test) 58 End Function 59 60 Protected Overrides Sub Dispose(ByVal disposing As Boolean) 61 If (disposing) Then 62 db.Dispose() 63 End If 64 MyBase.Dispose(disposing) 65 End Sub 66 End Class 67End Namespace 68

Edit.vbhtml(編集画面用のファイル)

VisualBasic

1@ModelType MvcApp.Test 2@Code 3 ViewData("Title") = "Edit" 4End Code 5 6<h2>Edit</h2> 7 8@Using (Html.BeginForm()) 9 @Html.AntiForgeryToken() 10 11 @<div class="form-horizontal"> 12 <h4>Test</h4> 13 <hr /> 14 @Html.ValidationSummary(True, "", New With { .class = "text-danger" }) 15 @Html.HiddenFor(Function(model) model.Id) 16 17 <div class="form-group"> 18 @Html.LabelFor(Function(model) model.Name, htmlAttributes:= New With { .class = "control-label col-md-2" }) 19 <div class="col-md-10"> 20 @Html.EditorFor(Function(model) model.Name, New With { .htmlAttributes = New With { .class = "form-control" } }) 21 @Html.ValidationMessageFor(Function(model) model.Name, "", New With { .class = "text-danger" }) 22 </div> 23 </div> 24 25 <div class="form-group"> 26 @Html.LabelFor(Function(model) model.itemId, htmlAttributes:= New With { .class = "control-label col-md-2" }) 27 <div class="col-md-10"> 28 @Html.EditorFor(Function(model) model.itemId, New With { .htmlAttributes = New With { .class = "form-control" } }) 29 @Html.ValidationMessageFor(Function(model) model.itemId, "", New With { .class = "text-danger" }) 30 </div> 31 </div> 32 33 <div class="form-group"> 34 @Html.LabelFor(Function(model) model.itemName, htmlAttributes:= New With { .class = "control-label col-md-2" }) 35 <div class="col-md-10"> 36 @Html.EditorFor(Function(model) model.itemName, New With { .htmlAttributes = New With { .class = "form-control" } }) 37 @Html.ValidationMessageFor(Function(model) model.itemName, "", New With { .class = "text-danger" }) 38 </div> 39 </div> 40 41 <div class="form-group"> 42 <div class="col-md-offset-2 col-md-10"> 43 <input type="submit" value="Save" class="btn btn-default" /> 44 </div> 45 </div> 46 </div> 47End Using 48 49<div> 50 @Html.ActionLink("Back to List", "Index") 51</div> 52 53@Section Scripts 54 @Scripts.Render("~/bundles/jqueryval") 55End Section

試したこと

コントローラのCreateアクションや、Editアクションにブレイクポイントを貼りつつ、処理の流れを確認しましたが、
エラー箇所の少し前、
id = TempData("id")
itemId = TempData("itemId")
の箇所については、Create.vbhtmlで入力した値が、取得できていることを確認できました。

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

※一部、質問に関係がないと思われるファイルや、コードは削除しております。
※また、フォームの入力制限に関しても、現段階の目的からは外れるため、まだ何も実装していない状態です。

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

使用PC
Windows10

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題が出ている式の最後に FirstOrDefault() を追加したらどうなりますか?

投稿2020/06/08 22:29

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Eltk

2020/06/09 04:26

試してみましたが、以下のエラーになりめした。 メソッド’System.Object CompareObjectEqual(System.Object, System.Object, Boolean)’はLINQ to Entitiesでは認識されないため、ストア式に変換できません。 ※申し訳ございません。次の返信は19:30以降になります。
退会済みユーザー

退会済みユーザー

2020/06/09 05:24

Linq to Entities の式は 全部 SQL に変換して SQL Server で実行しようとするのですが、Visual Basic の CompareObjectEqual メソッド(等値演算子 = を表すそうです)が SQL に変換できないということでエラーになったように見えます。 詳しくは以下の記事を見てください。 LINQにも色々 ~SQLに変換されるモノと変換されないモノ https://codezine.jp/article/detail/8474 Where(Function(data) data.id = id) の = はダメなのですかね? VB.NET は全く使わないので使わないのでそういう経験はないのですが・・・ 調べてみてください。自分も調べてみますが。
退会済みユーザー

退会済みユーザー

2020/06/09 06:23 編集

ちょっと調べてみましたが、上のコメントに書いた、 > Where(Function(data) data.id = id) の = はダメなのですかね? ということはさすがになさそうです。 エラーメッセージでググると以下のような記事がヒットしますが、以下の記事にあるように Linq to Entities の式に SQL に変換できない何かをまぜこぜにしてませんか? Error Getting Record “LINQ to Entities does not recognize the method” https://stackoverflow.com/questions/11766440/error-getting-record-linq-to-entities-does-not-recognize-the-method 質問のコード、 > Dim test As Test = (db.Tests.Where(Function(data) data.id = id).Where(Function(data) data.itemId = itemId) は閉じかっこ ) が足りないようで何か変です。質問欄に書くときに大幅に省略するなどしていて、実はそれではないのでは?
Eltk

2020/06/09 12:06

>SurferOnWww様 色々と調べてくださり、ありがとうございます。 閉じかっこの件ですが、失礼いたしました。 「db」の前のかっこが不要でしたので、修正いたしました。 ※質問欄に書く前のコードは正しかったのですが、こちらへ転載する際に、(以前書いていたCtypeの削除漏れで)誤ってしまっておりました。 僕の方でも色々と試してみまして、 2つ目のコメントに添付いただきました記事の中で使われていた「.Single」を使って 「Dim test As Test = db.Tests.Where(Function(data) data.id = id).Where(Function(data) data.itemId = itemId).Single()」 と修正しましたところ、うまくいきました。 参考資料を添付いただき、ありがとうございました!
退会済みユーザー

退会済みユーザー

2020/06/09 12:35

FirstOrDefault がダメで Single で解決したというのは考えにくいです。テキトーに終わりにせず、きちんと原因を調べた方が良いと思いますよ。
退会済みユーザー

退会済みユーザー

2020/06/10 01:53 編集

きちんと原因を調べて書いてもらえませんか? 最初の例外、 > 'MvcApp.Test' にキャストできません と、その次の例外、 > ストア式に変換できません は原因が違ってます。例外の理由は何か理解していますか? > 「.Single」を使って というのは最初の例外に対しては有効ですが(注: Single で解決できるのなら FirstOrDefault で解決できます)、次の例外「ストア式に変換できません」には無効です。 何かここに書いてないことをしてますよね?
Eltk

2020/06/10 12:55 編集

>SurferOnWww様 返信が遅くなり申し訳ございません。 いただいた回答の中でのコメント上でのやりとりだったからか、通知が来ておらず、先程、確認いたしました。 以下、こちらで調査した結果のご報告と、コメントの返信をさせていただきます。 >例外の理由は何か理解していますか? 最初のエラーの理由は、型が異なることによるエラー 2つめのエラーの理由は、LINQ to Entitiesで使用できないメソッドが使われていることによるエラー を指しているものと思っております。 >FirstOrDefault がダメで Single で解決したというのは考えにくいです。 →結論を申し上げますと、FirstOrDefaultでも同様に動作しました。 最初にいただいた回答に対して、エラーが起こった旨を報告しましたが、その理由を順を追って説明させていただきます。 1.今回、質問させていただいているコードとは別に、元のコードがあります。そのコードは、質問内容に書かせていただいている「省略前の」コードではなく、また別のコードです。(仮にAとします) そして、そのコードAは、自宅で確認することができないコードのため、自宅では(基本的にやろうとしていることは同じ)似たようなコードを書いて勉強しております。(自宅で書いているコードをBとします) 2.もともとはAで書いていたコードで起こったエラーでしたが、自宅で、似たようなコードBを作成し、エラー解決を試みておりました。 3.「'MvcApp.Test' にキャストできません」というエラーはAにもBにも同様に発生しておりました。 ※このタイミングでteratailに質問投稿いたしました。 4.SurferOnWww様の返信を確認した際は、「Aのコードは触ることができるがBのコードは触ることができない」状況にあり、 Aのコードの方に、「FirstOrDefault」を試したところ、 「ストア式に変換できません」のエラーが発生しました。 ※このタイミングでteratailに「エラー解決できない旨」の返信をいたしました。 5.その後、自宅にてBのエラー解決を引き続き、行っている際、「.Single」で期待通りの結果が得られたため、teratailにて「解決」の報告をさせていただきました。 ※その際、(FirstOrDefaultは試していなかったため)自身では、「.Single」だからこそ上手く動作した、と思っておりました。 6.本日、Aのコードを触るタイミングで、(多少コードを触った後でしたが)「.Single」で当初のエラーは解決できたことを確認。 ※別のエラーが発生したため、「編集画面に遷移し、(新規登録時の)値が表示されるところまで」を確認しました。ただ、また別の問題でエラーが発生したため、その先まで進むことができておりません。 ※「その先」とは、編集画面に遷移後、さらに入力値を編集し、登録するまでの処理ですが、こちらに関してはAとBで大分コードが異なるため、質問内容の範疇を超えるため、割愛させていただきます。 7.先程、自宅にてSurferOnWww様の返信を確認し、Bのコードで「FirstOrDefault」を試してみると、「Single」同様に、エラー解決することを確認。 ※こちらに関しては、Aで起こったようなエラーは発生せず、遷移後の編集画面で編集し、更新ボタンをクリックしても、内容が更新されるところまでを確認。 長くなりましたが、 もともと質問したいと提示させてもらっているBのコードについては、(SurferOnWww様の回答通り) 「FirstOrDefault」(もちろんSingleも)で、解決となりました。 今回の質問の基となっているAのコードについては、「FirstOrDefault」によりエラー箇所について解決できたが、それだけで、完全に想定通りの動作とはなっていない、というのが現状です。 (今回の質問内容の範疇を超えているので、また別問題となりますが) AとBのコードの違いについては、色々とあるのですが、事細かく両者を見比べることができない環境にあります。 また、幸い「質問内容」に対する解決法は、「いただいた回答」に間違いはございませんので、その先のエラーについては、いったん自力で解決を試みたいと思います。 長々と失礼いたしました。
退会済みユーザー

退会済みユーザー

2020/06/10 13:14 編集

自宅と会社ではコード違うコード。最初の問題は会社のコードで起こった。自宅から質問しているので自宅のコードをベースにやり取りした。会社のコードとは違うので会社で回答者のレスを試した結果は自宅とは違う。そうとは知らない回答者にとっては訳の分からない話になってしまったというわけですか? それは真摯に解決策を考えてレスしている回答者に対して非常に失礼な話と認識できませんか? そういうイイカゲンなことをする人には怒りを覚えます。
Eltk

2020/06/10 13:49

>SurferOnWww様 おっしゃる通りです。 エラーの内容が全く同じだったため、お恥ずかしい限りですが、自身では今回の質問内容に影響する部分に関してのみ同様の動作をするコードを書いているという自覚でした。 大変申し訳ございませんでした。 環境の違う状態で試し、不完全な情報で返信をしましたことを深く反省をしております。 二度とこのようなことはないようにいたします。 申し訳ございませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問