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

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

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

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

Q&A

2回答

1570閲覧

ASP.NETで複雑な構造の情報をController->Index->Edit->Controllerと渡すときにnullにしない方法を知りたい

cancat

総合スコア313

ASP.NET

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

0グッド

0クリップ

投稿2017/05/26 02:57

こんにちは。
Windows10でASP.NETのアプリケーションを開発しています。
Visual Studio 2017 Communityを使っています。

###前提・実現したいこと
Controller.cs->Index.cshtml->Edit.cshtml->Controller.csとデータを受け渡しするときの挙動を教えてください。

###試したこと
Modelを用意しました。

Controller.cs
でデータベースからModelに値を入れました。
[HttpGet]
public ActionResult Index()
{
var model = db.Users;
return View(model);
}

Index.cshtml
@model Models.UserModel

Edit.cshtml
@model Models.UserModel

@Html.LabelFor(model => model.Password)
@Html.PasswordFor(model => model.Password, new { @class = "form-control" })
などのように必要なものを表示。

###発生している問題・エラーメッセージ
ModelにはId, Password, CreateDate, Items(そのUserに紐づくデータ)などがあります。
このうち、Idは自動採番したもので編集されては困るのでHiddenにしています。
CreateDateも同様に、編集されては困るのでHiddenにしています。

Itemsは構造が複雑で、なにもしていません。

この状態で、Index->EditまではItemsを保持しているのですが、Edit->ControllerにもどすとItemsが欠落します。nullになります。
Hiddenにすれば欠落しないようなのですが、Itemsは構造が複雑で、Hiddenで書くのもたいへんそう。

複雑な構造の情報をController->Index->Edit->Controllerとわたすとき、とくにEdit->Controllerに渡すときに、nullにせずに渡すには、View(Edit.cshtml)で値をすべてhiddenにして書き出す必要があるのでしょうか?

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio Community 2017
Version 15.0.26228.9 D15RTWSVC
Microsoft .NET Framework
Version 4.6.01586

です。
よろしくお願いします。

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

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

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

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

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

workaholist

2017/05/26 04:08

Index.cshtmlからEdit.cshtml、Edit.cshtmlからController.csにはどのようにしてモデルを渡していますか?
cancat

2017/05/26 04:20

submitしているだけです。@modelで自動で渡るのかと思ってます。
guest

回答2

0

Index.cshtmlからEdit.cshtmlのモデルの渡し方は正確に言うと、Index.cshtmlのform(BeginFormで生成)をsubmitして、Controller.csの何らかのアクションメソッドに渡してますよね?
そのアクションメソッドで表示するビューがEdit.cshtmlだと思います。
であれば同じように、Edit.cshtmlのformをsubmitしてController.csのアクションメソッドを呼べば良いと思います。
もちろんEdit.cshtmlのformの中にはId, Password, CreateDate, Itemsがinputタグのvalueとして設定されといけませんが。

投稿2017/05/26 04:48

workaholist

総合スコア559

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

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

cancat

2017/05/26 06:12

Index.cshtmlのform(BeginFormで生成)をsubmitして、というところの意味を理解できませんでした。 IndexのときはController.csのIndex()メソッドに、EditのときはEdit(UserModel user)に渡しています。
workaholist

2017/05/26 06:18

Index.cshtmlからEdit.cshtmlはどうやって画面遷移しているのですか?
cancat

2017/05/26 06:58

@Html.ActionLink("Edit", "Edit", new { id = @Model.UserId }) です。
workaholist

2017/05/26 07:10 編集

先ほどはsubmitしていると仰っていましたがsubmitしていないですよね? @Html.ActionLinkは<a>タグを生成します。 のでPOSTではなくGETで遷移してますよね。 そして遷移先はEditControllerのEditアクションメソッドですね。 それに渡しているデータはモデルのUserIdだけですね。 「Index->EditまではItemsを保持しているのですが」とありますが、UserIdだけを渡しているのでEditアクションモデルの中でUserIdを元にモデルを復元しているのでしょうか。 何にせよ全てプログラムコードを想像してお話しているので全て予想です。
cancat

2017/05/26 07:14

あ。Edit.cshtmlで編集結果を登録して更新して保存するボタンはsubmitです。 コード複雑で抜き出すのが困難なのですが、どのあたりを抜き出せばよいでしょう・・・?
workaholist

2017/05/26 07:37

takkoさんとのやり取りのコメント欄で既にその話が始まっているようですのでそちらでお願いします。
guest

0

jsを使用して、form送信してはいかがでしょうか。

投稿2017/05/26 02:59

King_of_Flies

総合スコア382

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

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

cancat

2017/05/26 04:24

大変恐縮ですが、あまりに的外れです。 C#ユーザーなので、javascriptは(ごく簡単なものをのぞいて)書けません。 model->Controller->Edit->controllerでデータを受け渡しするのは、ごく基本的なことなので、C#(ASP.NET)でできるはずと思います。 もしできないとしたら、よほどダメなのではないかと思いますが、そうではないのではないかと思っています。
King_of_Flies

2017/05/26 04:51

@model ~UserModel @using(html.BeginForm("ActionName","ControllerName")){ @Html.LabelFor(model => model.Password) @Html.PasswordFor(model => model.Password, new { @class = "form-control" }) <input type = "submit"> } ってフォーム作ってますか?
cancat

2017/05/26 07:03

これはどのファイルに書くものですか? Index.cshtml? Edit.cthtms?
cancat

2017/05/26 07:07

確認したところ、どちらにも書いてないです。
King_of_Flies

2017/05/26 09:08

submitって言うのはフォームを送信する処理なわけですよ。 フォームが無いのであればsubmitできないのでは?と思った次第です。 書くのはcshtmlの内部です。
King_of_Flies

2017/05/26 09:09

送信したいプロパティが記述されてる箇所をformでくくってください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問