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

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

新規登録して質問してみよう
ただいま回答率
85.35%
TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

ASP.NET MVC Framework

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

Q&A

解決済

1回答

5876閲覧

MVCのRedirectToActionが機能しない

rastynail3366

総合スコア6

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

ASP.NET MVC Framework

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

0グッド

0クリップ

投稿2020/06/12 12:05

MVCのRedirectToActionが機能しない

MVCのモデルだけだとたりない情報があったので、javascriptからformdataを送信したのですが、コントローラーには届くのにRedirectToActionが機能しません。

発生している問題

RedirectToActionでIndexに戻らない。
バリデートがエラーの時にModelStateのメッセージが表示されない

該当のソースコード

MVC

1[HttpPost] 2[ValidateAntiForgeryToken] 3public ActionResult Edit([Bind(Include = "Id,,,,...他プロパティいろいろ")]Model model) 4{ 5 var req = Request.Form; 6 //--Request.Formへの処理--- 7 // 略 8 //------------------------ 9 if(ModelState.IsValid) { 10 return RedirectToAction("Index"); 11 } else { 12 return View(model); 13 } 14} 15

cshtml

1@using (Html.BeginForm("Edit", "model", FormMethod.Post ,htmlAttributes: new { @id = "editform" })){ 2 //modelの入力フォーム 3 <div class="col-xs-5"> 4 <select id="multiselect"> 5 //プルダウンメニュー 6 </select> 7 <button type="button" id="presubmit">更新</button> 8}

typescript

1 const form = <HTMLFormElement>document.getElementById("editform"); 2 //サブミット前選択されたメニューを追加する 3 document.getElementById("presubmit").addEventListener("click", () => { 4 var formData = new FormData(form); 5 6 for (var i = 0; i < multiselect.options.length; i++) { 7 formData.append("multiselect[" + i.toString() + "]", multiselect.options[i].value); 8 } 9 10 const url = location.origin + "/model/Edit"; 11 12 const xhr = new XMLHttpRequest(); 13 xhr.open(HttpMethod.POST, url, true); 14 xhr.responseType = ''; 15 xhr.setRequestHeader("contentType", "application / json; charset = utf - 8"); 16 xhr.send(formData); 17 Indicator.Hide(); 18 });

試したこと

XMLHttpRequestではなくform.submit()でも試してみたのですが、form.submit()だと追加した情報が反映されませんでした。

補足情報

IEも対象なのでES6は使用できない状況です。
ライブラリ等はASP.NET MVCで初期設定で存在しているbootstrapのみ使用しています。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/06/12 13:47

質問に書かれている情報だけでは何をしているのか分かりません。何が問題なのかもわかりません。 デバッガを使って if(ModelState.IsValid) がどうなるかなど調べてみましたか? リダイレクトの意味が分かってますか? 質問に書かれている JavaScript がどのタイミングで動くのか、それで何がしたいのか不明です。 IE も対象とのことですが、IE では動かない () => { ... } というコードもありますし。何か全く見当違いのことをしていませんか? 質問者さんは ASP.NET MVC 開発にどのくらい経験があるのでしょう?
guest

回答1

0

ベストアンサー

XMLHttpRequestではなくform.submit()でも試してみたのですが、form.submit()だと追加した情報が反映されませんでした。

JavaScript で送信するのでなく、普通に input type="submit" ボタンのクリックなどで送信すれば「追加した情報が反映されません」以外は問題なく、期待通り検証がかかり、検証 OK の時は index にリダイレクトされるのですよね。

であれば、JavaScript で送信するのは止めて、普通に input type="submit" ボタンのクリックなどで送信するその方向に進んで、今とは別の方法で「追加した情報」の送信・受信を行う手段を考えてはいかがですか?

どのように検証機能を実装しているのか書いてないのでわかりませんが、標準で ASP.NET MVC に実装されているデータアノテーションによるクライアントサイドの検証のことを言っているのであれば、JavaScript で(質問のコードのように ajax で)送信している限り働かないと思います。サーバー側はモデルバインディングがされていれば働くはずですが、その前にエラーでモデルバインディングがされてないとダメでしょう(その場合でも ModelState.IsValid は false になるはずですが)

もう一つの問題、

コントローラーには届くのにRedirectToActionが機能しません。

は、JavaScript による送信でもコントローラーには制御が飛んでくるのだから、index にリダイレクトされないのは if(ModelState.IsValid) が true にならないから以外の原因はなさそうですが、その理由は質問に提供されている情報では分かりません。分かるように質問を書いてくれれば考えようもありますが・・・

【追記】

どうしても JavaScript で送信したいということなら、以下の記事の応用でできるかもしれません(まだ思い付きレベルです。Edit 機能を実装するのはかなりの茨の道になりそうな予感がしますが)。

以下の記事のアプリは ASP.NET Core 3.1 MVC ですが、.NET Framework 版の MVC5 でも同じことはできます。

jQuery ajax で部分ビューの呼出・表示
http://surferonwww.info/BlogEngine/post/2020/03/07/use-jquery-ajax-to-request-and-render-partial-view.aspx

jQuery ajax を使っている点、CSRF 防止用のトークンを含むフォームデータを jQuery の .serialize() メソッドを使って取得しそれを data パラメータに設定して送信している点、応答は部分ビューとして返している点に注目してください。

上の記事のサンプルではユーザー入力はないのでその検証関係のコードは実装してませんが、Model を定義して追加できると思います(要件次第ですが)。

ただ、やはり、クライアント側での検証は普通に submit した時のようにはいかないと思いますが。

投稿2020/06/13 01:43

編集2020/06/14 01:49
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

rastynail3366

2020/06/14 23:49

ありがとうございます。やっぱりJavaScriptでModelにないプロパティを追加するのは厳しいみたいですね。 ViewModelを生成して他のコントローラーを作成してみることにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問