前提・実現したいこと
タイトルにも書かせていただいているのですが、
①新規登録ページで、フォームの内容を登録
②登録後に、(普通なら一覧ページ(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以降になります。
※休日の返信は不定期です。
申し訳ございませんが、どうぞよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/09 04:26
退会済みユーザー
2020/06/09 05:24
退会済みユーザー
2020/06/09 06:23 編集
2020/06/09 12:06
退会済みユーザー
2020/06/09 12:35
退会済みユーザー
2020/06/10 01:53 編集
2020/06/10 12:55 編集
退会済みユーザー
2020/06/10 13:14 編集
2020/06/10 13:49