ASP.NET MVCの一覧編集画面の実装について

このQ&Aのポイント
  • ASP.NET MVCを使って構築中のサイトで、一覧表示のままCRUD(追加・更新・削除)するインターフェースを求められています。
  • 各行にテキストボックス・更新ボタン・削除ボタンがあり、同じForm内に複数の更新ボタンがある場合、formのPOST先を変える方法についても知りたいです。
  • 検証失敗時に全体を再表示する方法も知りたいです。
回答を見る
  • ベストアンサー

【ASP.NET MVC】一覧編集画面

いつもお世話になります。 ASP.NET MVCを使って構築中のサイトで、また暗礁に乗り上げております。 商品一覧の画面で、一覧表示のままCRUD(追加・更新・削除)するインターフェースを客先から求められております。 一覧表示 → 個別画面でのCRUDはできていますが、画面遷移が面倒ということで却下されました。 ASP.NETでいう、GridViewのようなテイストです。 (各行にテキストボックス・更新ボタン・削除ボタン) モデルはこんな感じです(簡略化してあります。実際にはご教示いただいたカスタム検証もあります) public class Lady {  public int ID { get; set; }  public string name { get; set; }  public int areaID { get; set; }  public int salesAmount { get; set; } } public List<Lady> ladies; 一覧表部分のビューはこんな感じです(細かい点は省略です) @foreach (var lady in Model.ladies){  @using(Html.BeginForm("UpdateLady","Admin")) {   @Html.Hidden("ID", lady.ID)   @Html.TextBox("name", lady.name)   @Html.DropDownList("areaID", new SelectList(model.areas, "areaID","areaName", lady.areaID))   @Html.TextBox("salesAmount",lady.salesAmount)   <!-- 以降不明 -->   <input type="submit" value="更新"/>   <input type="submit" value="削除"/>  } } コントローラ class AdminController {  public EditLady(){   var model = new EditLadyView();   return View("EditLady", model);  }  [HttpPost]  public UpdateLady(Lady lady){   if (ModelState.IsValid){    // 更新    // lady.IDをキーにしてDBを更新   } else {    // 再表示 <!-- ここがわからない -->   }  }  [HttpPost]  public DeleteLady(int ID){   // 削除   // IDをキーにしてDBを削除  } } 質問点は以下の通りです。 ■表示はOKですが、できたhtmlを見ると、各行の項目が同じid / name名になります。これで正しいですか? ■同じForm内に更新ボタンが複数あった場合、formのPOST先を変える必要がありますが、javascriptを使うのでしょうか? ■検証失敗時、全体を再表示するにはどういった方法があるでしょうか? 読み直すと入力した値が消えてしまいます。 会社にMVCの経験者がおらず、苦労しています。 なにとぞお助けください。

質問者が選んだベストアンサー

  • ベストアンサー
  • shockatz
  • ベストアンサー率80% (153/191)
回答No.4

こんにちは。 一覧で表示し、更新は一行単位というのは、GridViewやListViewではよくやる処理です。 項目数が少なく行数が限定的な場合を除き、全体一括更新は使ってはいけません! 要点だけ述べます。 ご謙遜されていますが、MVCの内容ををお分かりのようなので、自分で解決策を考えてください。 1 こんな風にレンダリングされるフォームを作ります。 <input type="hiddden" name="ID" value="1012" /> <input type="text" name="1012.name" value="東京花子" /> <input type="text" name="1012.address" value="千代田区一丁目一番地" /> 2 更新メソッドで、いきなりLady型のladyで受けず、IDだけを取得します。 3 取得したIDを接頭辞(prefix)として、表示に使ったビューモデルの指定ID行を、TryUpdateModelで更新します。 4 ModelStateは、TryUpdateModelでも有効です。 5 DB更新はただUpdateすればいいだけ 6 検証失敗時のリトライは、更新できなかったビューモデルをそのまま返します。 ASP.NET MVC3関連の洋書には、こういうTable CRUDの話題が良く出ています。 英語読まなあかんのですが。。苦(笑

nayutax
質問者

お礼

詳細なアドバイスをいただき、ありがとうございます。 情けないことに、まだ問題を解決できていません。 今回なんとか、お客様に個別更新で納得いただきました。 自分の力量不足で情けないです。 でも必ず、この問題はクリアしようと思っていますので、また不明点があったらつきあってやって下さい。

その他の回答 (3)

  • onos
  • ベストアンサー率81% (127/155)
回答No.3

> まことにお恥ずかしい限りですが、では、どのように更新画面を組み立てれるべきだと思われますか? 仕様の話なんで、お客さん(利用者?)とつめるべきでしょう。 MVCで組みやすく、一覧形式は保持したい、ということなら > ・一覧表表示での1行更新という仕様に問題がある。全体一括更新にすべき。 となるかな。 ちなみに、別に「泥臭い」のが悪いとはおもってません。 仕様というかお客様のこだわりで、実装は泥臭いコーディングにせざるを得ないなんてことはいくらでもあることですから。

nayutax
質問者

お礼

onosさま、いつも有難うございます。 自分の力量不足で、一括更新を実現することができませんでした。 前にGridViewで何回もやっていた処理なので、なんでMVCでできないのか、もう一度よく考えてみます。 今回は有難うございました。

  • onos
  • ベストアンサー率81% (127/155)
回答No.2

> 一つのformに「更新」と「削除」のボタンが2つ出てくるのですが、そもそも各行ごとにformをつけるのは適正なのか? という点もわからないです。 別にformはいくつあってもかまわないと思います。 > 更新行は1行だけなのですが、検証エラー時も、再度、対象の1画面分のデータはすべて再取得しなければいけませんか? formを各行に設定した場合、ブラウザから投げられるのは更新行のデータだけです。 サーバー側には他のデータを取得する方法はありません。 #HTMLがステートレス、というのは理解されてますよね? まぁ、SessionだのTmpData(は、つまりSessionと同じですが)を使ってサーバ側にデータを保持しておく方法がないわけではないですが。 それであってもある意味データを再取得している、といえなくもないわけで。 あと、こういうユーザーインターフェースだと、2行文のデータなおしたあと、1行めの更新ボタンだけ押したとき、とか、いろいろと問題は多くでてきそうな気がします。 まぁ、仕様としてどう考えるか、なのでそういったときの対処方法がきちんと合意されていればよいですが。 > ASP.NETのような「サーバサイド検証」や「バインディング」の機能がないため、泥臭い大量コーディングを強いられます この仕様だと検証やバインディングもうまく使えない、というか使えるところが限られてくるかと。 泥臭いコーディングが必要じゃないですかね。

nayutax
質問者

補足

onos様、何度もありがとうございます。 本当に有難うございます(感涙 > formを各行に設定した場合、ブラウザから投げられるのは更新行のデータだけ はい、存じております。理解できました。 > この仕様だと検証やバインディングもうまく使えない、というか使えるところが限られてくるかと。 > 泥臭いコーディングが必要じゃないですかね。 まことにお恥ずかしい限りですが、では、どのように更新画面を組み立てれるべきだと思われますか? ・一覧表表示での1行更新はOK。フォームやHtmlヘルパーの設定の仕方に問題がある。 ・一覧表表示での1行更新という仕様に問題がある。全体一括更新にすべき。 ・一覧表表示での更新自体に問題がある。 本当に困っています。失礼とは存じますが、ご意見お聞かせください。

  • onos
  • ベストアンサー率81% (127/155)
回答No.1

> ■表示はOKですが、できたhtmlを見ると、各行の項目が同じid / name名になります。これで正しいですか? OKじゃないから質問してるのでは? それはともかく、どのようなデータを渡しているのか、またView側の受け取るデータの型がどうなっているか、とかが掲載されたプログラムだけじゃわかりません。 ちゃんと複数のデータ格納して渡せてます? > ■同じForm内に更新ボタンが複数あった場合、formのPOST先を変える必要がありますが、javascriptを使うのでしょうか? 行ごとに存在する更新ボタンのことですよね? だったらformのPOST先を変える必要はないように思いますが。。。 > ■検証失敗時、全体を再表示するにはどういった方法があるでしょうか? 読み直すと入力した値が消えてしまいます。 UpdateLady で受け取っているデータが一つだけなのが気になります。 ここで全データ受け取ってるならそのままもとのページに返せばいいだけのはず。 まぁ、どの部分を変更しようとしているか、という対象のとりだしに工夫が必要ですが。 データを一つしか受け取らないなら、他の行については再度取得してビュー側に渡す必要があると思います。

nayutax
質問者

補足

いつもありがとうございます。 ちょっと説明不足ですいませんでした。「一覧表示」しつつ、各行に更新・削除ボタンのあるインターフェースをMVCで作りたいのです。 表示するまでは問題ありません。 Model側にEditLadyViewというビュークラスを定義し、Controllerで初期化する際、ladiesプロパティに、取得したList<Lady>型を入れています。 一つのformに「更新」と「削除」のボタンが2つ出てくるのですが、そもそも各行ごとにformをつけるのは適正なのか? という点もわからないです。 phpなどですと、 <form action="update_lady">  <input name="ID" type="hidden" />  <input name="name" type="text"/> </form> (以降繰り返し) のように単純にタグ発生させるます(ASP.NETのような「サーバサイド検証」や「バインディング」の機能がないため、泥臭い大量コーディングを強いられます)。 こういう「行更新」をともなう集合型?のフォームについて知りたいです。 更新行は1行だけなのですが、検証エラー時も、再度、対象の1画面分のデータはすべて再取得しなければいけませんか?

関連するQ&A

  • 永続化前後のクラスの表現について C#

    ものすごくくだらない質問ですみません。 リレーショナルデータベースを使わざるを得なく、O/Rマッピングツールは使えない状況です。 class Employee があります。 StaffCodeがありますが、将来このコードが重複はありませんが変わる可能性があるので永続化を目的としてこれを主キーとして使えません。 そこで主キーにサロゲートキーを使おうと考えました。 アプリ側で対応するよりもデータベース側でオートナンバーを使います。 一応下記コードでこれから採番する社員と、永続化&採番したあとの社員を表現する事はできます。 しかし同じクラスを使うものなのでしょうか? クラスを分けるべきでしょうか? そもそも考え方がおかしいですか? Class Employee { Public Int Id { get; private set; } Public String Name { get; private set; } Public Int StaffCode { get; private set; } Public Employee(String name, Int staffCode) { this.Name = name; this.StaffCode = staffCode; } Public Employee(Int id, String name, Int staffCode) { this.Id = id; this.Name = name; this.StaffCode = staffCode; } Public Void SetId(Int id) { this.Id = id; } }

  • 【ASP.NET MVC】HTMLヘルパーについて

    ASP.NET MVCで開発しています。 型付けHTMLヘルパーが上手く理解(というか納得?)できないので どうかご教授願います。 ところで、事前にこちらのページを覗いております。 http://www.atmarkit.co.jp/fdotnet/scottgublog/20100113stronghelper/stronghelper.html さて、本題。 <%= Html.TextBoxFor(model => model.ProductName) %> というのが、 <input type="text" id="ProductName" name="ProductName" value="*model.ProductNameの値*"/> となるのは何となく理解ができます。 理解できるということの根拠として、id(およびname)の「ProductName」はまさに 記述されていますし、ラムダ式はmodel.ProductNameを返すようになっているから、 「.NETはnameとidとvalueを取得できるんだろうよ」、と予想できるからです。 旧来のHtmlヘルパー <%= Html.Textbox("ProductName",Model.ProductName) %> に比べて、 「name(id)属性用のパラメータが必要無い」 「テンプレート内でのコードインテリセンスが効く」 という利点があるそうですが、どうしてもここで納得出来ないことがあります。 この2点の利点を実現するのに、なぜラムダ式で実現できるのでしょうか? あるいは、なぜラムダ式が採用されたのでしょうか? 別の言い方をすれば、別にラムダ式を用いなくても、.NETが賢くなれば、 <%= Html.Textbox(Model.ProductName) %> という記述で、インテリセンスが効いてコンパイルチェックも実行されても おかしく無いと思うのですが・・・。 Modelオブジェクトの型宣言はテンプレートの先頭で行われているはずですから、 「Model.」と打ったところでModelのクラスと関連付いてもおかしく無いですよね? 別にMSの仕様に文句をつけるつもりはないのですが、 「先述の2点の利点を実現する」ことと、「ラムダ式の記述」というのがどうも一致しません。 開発作業には支障ないのですが、腑に落ちなくて困っています。 ソースコードを読んでも、自分の疑問の解決には至りませんでした。 どうぞよろしくお願い致します。

  • 【ASP.NET MVC】フォームヘルパーの是非

    いつも大変にお世話になっています。 今回も例によってASP.NET MVCの質問です。 ASP.NET MVCでは、Htmlヘルパーを使用してビューを記述するのが常識かと思います。 例) @Html.Textbox("name", Model.name) 今回、デザイナが加わる仕事で、完成後にデザイナ側でフォーム訂正が必要になることが予想されます。 またその際、デザイナから「できるだけ独自仕様(Lazorのこと?)のテンプレートを使用しないように」とのお達しがあったため、苦慮しております。 質問です。 Htmlフォームヘルパーを使わずに、純粋なHTML記述を行った場合、どのような支障が考えられますか? 要件: @Html.Textbox("name", Model.name) と書かずに。 <input type="text" id="name" name="name" /> と(HTML展開後の文法で)書く場合の違いを知りたい です。同じ動作をするのでしょうか?また、違いの程度は? です。なにとぞよろしくお願いします。

  • EF CodeFirst についての質問

    entity framework code first についての質問です。 既存のデータベースから移行するときに詰まってしまいました。お助けください。 複数の外部キーを同テーブルから参照している場合Entityクラスにはどう外部キーを書けばいいのでしょうか? 例 class Store{ public int StoreId {get;set;} public int UserId {get;set;} public int UserId2 {get;set;} * この部分です public virtual User User {get;set;} } class User{ public int UserId {get;set;} public int Name {get;set;} public virtual ICollection<Store> Stores { get; set; } } いろいろ検索して調べてみたのですが解決できませんでした。 よろしくお願いいたします。

  • WEBアプリのMVCについて質問です。

    一般的なフレームワークを用いたMVCについて質問です。 例えばM、これはモデルですね。 普通DBヘの接続はモデルでおこないクエリの発行もモデルで行いますね。 その後、クエリ実行後の結果をコントローラー側に返すと思います。 このとき、普段わたしはモデル上ではDB空の目的のデータをいっさい処理せずそのまま コントローラに返します。 返り値として、何かしらの一覧データを取得するものとします。例えば [ {name : "タロウ" , age : "20","town_id" : 10,"city_id" : 49, "prefecture_id" : 23}, {name : "花子" , age : "20","town_id" : 10,"city_id" : 49, "prefecture_id" : 23}, {name : "邦夫" , age : "20","town_id" : 10,"city_id" : 49, "prefecture_id" : 23} ] といった感じで特定の組み合わせのハッシュを多次元配列(リスト)的にラップしたものがかえりますよね。 そして、上記データをコントーラー側が受け取り、さぁいざビューへと受け渡す際に、どの程度コントローラでデータの 加工を行うものかが気になっています。 たとえば上記データでは「県市町」のデータがユニークなIDとして保持しています。このままでは「タロウ」が どの住所なのかがわかりません。どこかで「県市町」のデータリストを受け取りループで一致する住所を取得する 必要があります。 それをコントローラあるいはビュー・・・・どちらで行うのがMVCとして正しいのでしょうか?多少のループなら ビュー側で行うのもありかとおもいますが、はやりビューがループであふれかえるのは作業しにくいですよね。 MVCの基本だとは思いますが、rubyやPHPなど、フレームワークごとの細かい思想はあるでしょうが 一般的なMVCとしてみるとどうでしょうか? ちなみに、モデル内でjoin などつかって県市町のテーブルをくっつけるのはここでは考えないものとしてください。 個人的にはビュー内では大きなループ一度ですませたいものですが ・・・。

  • HTML内から画面で選択した文字列のIDを取得する方法

    こんばんは。 質問させて下さい。 例えば以下のようなHTMLを出力し、 なんらかのタグでNAMEを付けておきます。 ---<HTMLファイルここから       : <XXX NAME="ID001"></XXX>ようこそJavaScriptへ。 <XXX NAME="ID002"></XXX>うまく表示されているでしょうか? <XXX NAME="ID003"></XXX>たまたま表示されているだけでしょうか?       : <XXX NAME="IDnnn"></XXX>これはテスト文字列です。       : ---<HTMLファイルここまで この時に、「たまたま表示されている」をマウスで範囲選択し、 document.selection.createRange().textや window.getSelection().toStringなどで文字列を取得して、 XXXタグのNAMEよりID003を拾うには どういったやり方があるでしょうか?

  • ヤフーオークション落札者一覧について教えて下さい

    ヤフーオークションで私の品物を落札した出品者一覧で落札したはずの人の名前が出てこないのですがこれは相手が落札一覧から私の商品IDを削除していると私の出品者一覧にも表示されないのでしょうか? 古い年月のものではなくわりかし最近のものなのでいくら探しても一覧が見つからないので不思議に思っています。 教えて下さい。

  • PHPでのCookie

    PHPでクッキーを使い、下記のような入力フォームを作りました。 form.phpで入力→form2.phpで正常出力出来るのですが、 form2.phpで一度更新しないと、結果が画面に表示されません。 これをform2.phpを開いた時点で表示されるようにするには、どのように書けばいいのでしょう。 後1つあります。form.phpで 「テスト&1」と書くと「テスト」としか表示されなく、&とそれ以降が記憶されません。 これはなぜでしょうか? お願いします。 【form.php】 <?PHP parse_str($_COOKIE["city"]); parse_str($_COOKIE["city_name"]); ?> <html> <form method="post" action="form2.php"> <?PHP echo "名前1<input type=text name=name1 maxlength=16 size=12 value=$set_name1> <BR>ID<input type=text name=p1 maxlength=8 size=6 value=$set1><BR><BR>"; echo "名前2<input type=text name=name2 maxlength=16 size=12 value=$set_name2> <BR>ID<input type=text name=p2 maxlength=8 size=6 value=$set2>"; ?> <input type="submit" value="実行"> </form> </html> 【form2.php】 <?php if ($_POST) { $city1 = $_POST["p1"]; $city2 = $_POST["p2"]; $city_name1 = $_POST["name1"]; $city_name2 = $_POST["name2"]; setcookie ("city", "set1=$city1&set2=$city2",time()+3600*24*90); setcookie ("city_name", "set_name1=$city_name1&set_name2=$city_name2",time()+3600*24*90); } parse_str($_COOKIE["city"]); parse_str($_COOKIE["city_name"]); echo $set_name1; echo $set1; echo $set_name2; echo $set2; ?>

    • ベストアンサー
    • PHP
  • PHPでスレッド式掲示板を作りたいです

    こんにちは。現在Androidアプリで掲示板を作ろうと思いPHPとDBを活用してスレッド式掲示板を作成しています。 テーブルはこのような感じで構成しています。 スレッド一覧テーブル sureid(int ai) surename(text) name(text) time(text) rescount(int) コメントテーブル sureid(int) surename(text) name(text) msg(text) id(text) time(text) 作っていく途中で躓いてしまったので御教授願います。 1つ目 スレッド一覧画面で選択したsureidをGETしスレッドの中の画面でGETしたsureidの投稿を表示させたい。 2つ目 スレッド一覧画面で各スレッド一覧の横にスレッドのレス数を表示させたい。 <?php $USER= ''; $PW= ''; $dnsinfo= ""; $user= array(); $pdo = new PDO($dnsinfo,$USER,$PW); $sql = "SELECT * FROM thread"; $stmt = $pdo->prepare($sql); $stmt->execute(null); while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $user[] = array ('surename'=> $row["surename"] ,'name' => $row["name"] ,'rescount' => $row["rescount"]; } $res = array_reverse($user); echo json_encode($res); ?> スレッド一覧のプログラムはこのようになっています。

    • 締切済み
    • PHP
  • select from where

    行き詰ってます!ご教授下さい。 データの一覧から【更新】【削除】編集作業を行いたいのですが、うまくいきません。 ソースを記載しますので、修正点をお教え下さい。 データの一覧はうまくいっております。登録も出来ております。 '##### データ参照 ##### strSQL = "select * from テーブル名" Request.QueryString("ID")にてリンクをかけてその情報を編集したいのですが、値が取得できません。 <a href="test.asp?ID=<%=("データベースオートナンバー")%>">更新</a> 編集側で以下、条件抽出を出すと ID 1 のデータが表示されるのですが、 '##### データ参照 ##### strSQL = "select * From SITE_DATA where 【 ID=1 ここです】" ID【 <%=objRS("ID")%> 】 NAME【 <%=objRS("NAME")%> 】 URL【 <%=objRS("URL")%> 】 私が行いたいのは、データ一覧から更新リンクをクリックすると、 そのデータを抽出し、表示、編集を行いたいと思っています。 データ1を<a href="test.asp?ID=ナンバー...【更新】</a> データ2を<a href="test.asp?ID=ナンバー...【更新】</a> データ3を<a href="test.asp?ID=ナンバー...【更新】</a> エラーなどは出ないのですが、まったく表示されず、まいっています。 参考書などをみているのですが、いまいち理解ができません。 ※初心者ですので、理解が浅すぎる事は分かっています。どうか宜しくお願いします。 説明がうまく伝わればよいですが、、、

専門家に質問してみよう