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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Razor

RazorはASP.NET Web PagesとASP.NET MVCで使われているビュー・エンジンです。HTMLマークアップとC#またはVisual Basicのコードに対応しています。マークアップとコードの間の切り替えは"@"で記されています。

ASP.NET

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

Q&A

解決済

1回答

1657閲覧

スキャフォールディングで生成したCreateのルーティングパラメーターをIndexに引き継げない

pomu.pomupomu

総合スコア18

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Razor

RazorはASP.NET Web PagesとASP.NET MVCで使われているビュー・エンジンです。HTMLマークアップとC#またはVisual Basicのコードに対応しています。マークアップとコードの間の切り替えは"@"で記されています。

ASP.NET

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

0グッド

1クリップ

投稿2018/09/26 08:15

前提・実現したいこと

いつもお世話になっております。ASP.NET mvc5 掲示板を作っている初学者です。
スキャフォールディングして生成したIndexとCreateについて問題が生じ、解決できないので質問を投稿しました。

お手数ですが、回答をいただけたら嬉しいです。よろしくお願いします。
また、情報に不備等ありましたら加筆しますので、その旨も必要あれば一報ください。

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

ルートパラメーターを持つCreate中にあるHtml.BeginForm(){}で挟まれた<input type="submit">をクリックすることでデータベースを更新し、Indexに遷移します。この際、ルーティングパラメーターをIndexに遷移しても引き継げていないという問題が生じています。
実際、次のようになります。(遷移後のアクションが省略されているがIndexには辿り着いている)
http://localhost:52463/Responses/Create/3
↓ (inputタグをクリック)
http://localhost:52463/Responses

該当のソースコード

Controller : ResponsesController

c#

1 2 // GET: Responses 3 [Authorize] 4 public async Task<ActionResult> Index(int? Id) 5 { 6 var responses = db.Responses.Include(r => r.AspNetUsers).Include(r => r.Topics).Include(r => r.Topics).Where(r => r.TopicId == Id); 7 ViewBag.Id = Id; 8 return View(await responses.ToListAsync()); 9 } 10 11 // GET: Responses/Create 12 public ActionResult Create(int? id) 13 { 14 var UserId = User.Identity.GetUserId(); 15 ViewBag.ResOwnerId = UserId; 16 ViewBag.TopicId = id; 17 return View(); 18 } 19 20 // POST: Responses/Create 21 [HttpPost] 22 [ValidateAntiForgeryToken] 23 public async Task<ActionResult> Create([Bind(Include = "Id,TopicId,Title,Contents,ResOwnerId,ResponseCount,ViewCount,RecentResDate,")] Responses responses) 24 { 25 if (ModelState.IsValid) 26 { 27 var RecentResDate = DateTime.Now ; 28 db.Responses.Add(responses); 29 await db.SaveChangesAsync(); 30 return RedirectToAction("Index", "Responses"); 31 } 32 33 ViewBag.ResOwnerId = new SelectList(db.AspNetUsers, "Id", "Email", responses.ResOwnerId); 34 ViewBag.TopicId = new SelectList(db.Topics, "Id", "Title", responses.TopicId); 35 return View(responses); 36 }

View : Create.cshtml

c#

1 2@using (Html.BeginForm( 3 "Create", 4 "Responses" 5 )) 6{ 7 @Html.AntiForgeryToken() 8 9 <div class="form-horizontal"> 10 <h4>Responses</h4> 11 <hr /> 12 @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 13 14 15 16 <div class="form-group"> 17 @Html.LabelFor(model => model.TopicId, "TopicId", htmlAttributes: new { @class = "control-label col-md-2" }) 18 <div class="col-md-10"> 19 @Html.TextBox("TopicId", (int)ViewBag.TopicId, new { @class = "form-control", @readonly = "readonly" }) 20 </div> 21 </div> 22 23 <div class="form-group"> 24 <div class="col-md-offset-2 col-md-10"> 25 <input type="submit" value="レスを投稿する" class="btn btn-default" /> 26 </div> 27 </div> 28 </div> 29} 30 31@section Scripts { 32 @Scripts.Render("~/bundles/jqueryval") 33} 34

試したこと

c#

1public async Task<ActionResult> Create(){}

中を

c#

1return RedirectToAction("Index", "Responses",ViewBag.TopicId);

に変えるなど色々な変数を試してルーティングパラメーターの変更を試みましたが、なにもint型の値は通りませんでした。

一方、全く求めるものとは違うのですが、

c#

1return RedirectToAction("Index", "Responses", "aaaaa");

等に変更すると、Indexへ遷移した時のUrlは次のようになりました。
http://localhost:52463/Responses?Length=5

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

VS2017
Windows7
.Net Framework 4.6.1
MVC5

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/09/26 08:22

前のスレッド https://teratail.com/questions/147477 のような中途半端でいい加減な終わり方でなく、今回は完全に正しく解決するようにしてもらえるでしょうか?
pomu.pomupomu

2018/09/26 08:32

はい。前回のについては、もうここには書き込まないでということなのかと思って返信はやめていました。すみません。(jQuery反映については、多分仕組みは理解しましたが、まだ動作できていないので時間がかかります。)
退会済みユーザー

退会済みユーザー

2018/09/26 08:42

ここで前のスレッドのことを書くのもなんですが、前回のスレッドは、私がコメントで書きましたように、モーダルが何かが分からないということで、まだ話が始まってないのですよ。モーダルが何かが分かって、それに用いる .js, .css が分かって、それからそれらをどのように取り込むかという話になるのです。モーダルが何かは質問者さんに調べてもらわないと、第三者は知る由もないので、質問者さんの調査結果待ちで止まっているのです。
pomu.pomupomu

2018/09/26 08:51

なるほど。"何か"というのが理解できていなかったみたいです。(まだ勘違いしている気もします) 少し時間はかかるかもしれませんが、前質問の追記をします。お騒がせしてすみません。
退会済みユーザー

退会済みユーザー

2018/09/26 09:25

モーダルは、たぶん jQuery UI の Dialog か Bootstrap javascript の Modal ではないかと思います。モーダルが何か分かったら新たに別のスレッドを立てて質問してください。
guest

回答1

0

ベストアンサー

RedirectToAction メソッドは以下の引数を取ります。

RedirectToAction(String action, [,String controller] [,Object routrValue])

2 つ目までは質問さんのコードで設定済みで、3 つ目が未設定ですがそれに設定できます。

アクションメソッド Create の引数 response の Id プロパティで id に設定する値が取得できると想像してますが、であれば以下のようにして試してみてください。

return RedirectToAction("Index", "Responses", new { id = response.Id });

RedirectToAction メソッドで HTTP 302 応答が返ってくるはずですが、上手くいかない場合は、Fiddler などを使って応答ヘッダをキャプチャして、その Location をチェックしてみてください。

投稿2018/09/26 08:59

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pomu.pomupomu

2018/09/26 09:18

できました!ありがとうございます!!!!! 2日悩んでたのが解決してスッキリしました。本当にありがとうございます・・・! また、3つ目の設定以前に今回でいうとresponsesにあたる変数(?)の正体がわかっていなかったのがわかり、勉強になりました。 (前質問については日をまたぐことになりそうですが、追記します。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問