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

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

ただいまの
回答率

90.01%

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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 778

cancat

score 247

こんにちは。 
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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • workaholist

    2017/05/26 13:08

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

    キャンセル

  • cancat

    2017/05/26 13:20

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

    キャンセル

回答 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 16:08 編集

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

    キャンセル

  • 2017/05/26 16:14

    あ。Edit.cshtmlで編集結果を登録して更新して保存するボタンはsubmitです。

    コード複雑で抜き出すのが困難なのですが、どのあたりを抜き出せばよいでしょう・・・?

    キャンセル

  • 2017/05/26 16:37

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

    キャンセル

-3

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/26 16:07

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

    キャンセル

  • 2017/05/26 18:08

    submitって言うのはフォームを送信する処理なわけですよ。

    フォームが無いのであればsubmitできないのでは?と思った次第です。
    書くのはcshtmlの内部です。

    キャンセル

  • 2017/05/26 18:09

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

    キャンセル

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

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる