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

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

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

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

ASP.NET MVC 4

ASP.NET MVC4は、MVCパターンを利用して、高度なテスト機能と保守機能を備えた Web アプリケーションを開発するためのフレームワークです。

Q&A

1回答

4919閲覧

asp.net MVC コントロールのコピーの仕方で困っています。

4u4me

総合スコア50

C#

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

ASP.NET MVC 4

ASP.NET MVC4は、MVCパターンを利用して、高度なテスト機能と保守機能を備えた Web アプリケーションを開発するためのフレームワークです。

0グッド

0クリップ

投稿2016/08/23 01:18

編集2022/01/12 10:55

###前提・実現したいこと
textbox2つとbutton1つを設置し、
button(コピー)を押すと、
textboxとbuttonがコピーされたものを
コピーボタンを押すごとに1行追加したいです。

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

コピーがうまくいかないです。 Buttonのクリックイベントが必要だと思うのですが、Viewの方に書けばいいのか、Controllerに書けばいいのかわかりません。 また、ActionResultとの兼ね合いで、余計にclickイベントをどこに書いたらいいかわかりません。

###CopyController.cs

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Collections; using System.Web.UI.WebControls; namespace MvcPractice03.Controllers { public class CopyController : Controller { public ActionResult Copy(TextBox TextBox3, TextBox TextBox4, PlaceHolder PlaceHolder1) { Account original = new Account(); Account copy = new Account(); original.txt03 = TextBox3; original.txt04 = TextBox4; original.ph01 = PlaceHolder1; copy= original.Clone(); copy.txt03 = new TextBox(); copy.txt04 = new TextBox(); copy.ph01 = new PlaceHolder(); //PlaceHolder1をまるまるコピー return View(); } } //コピーするのみ public class Account { //宣言のみ public TextBox txt03; public TextBox txt04; public PlaceHolder ph01; //コントロールをViewからオブジェクトとしてもらってきた。 public Account Clone() { //PlaceHolder1をまるまるコピー return (Account)MemberwiseClone(); } } }

###Copy.aspx

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server"> <title><%=Html.Encode(ViewData["msg"])%></title> </head> <body> <form id="form1" runat="server"> <div> <%=Html.Encode(ViewData["msg"])%> <asp:PlaceHolder ID="PlaceHolder1" runat="server"> <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>&nbsp <asp:TextBox ID="TextBox4" runat="server"></asp:TextBox>&nbsp <asp:Button ID="Button1" runat="server" Text="コピー" onclick="BtnCopy_Click()" /> </asp:PlaceHolder> <br /> <%=Html.Encode(ViewData["id"])%> </div> </form> </body> </html>

###試したこと
textboxのインスタンス化、buttonのインスタンス化
Accountオブジェクトのクローン化

###補足情報(言語/FW/ツール等のバージョンなど)
C#,asp.net MVC

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

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

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

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

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

guest

回答1

0

なぜこのような処理が必要化はさておき、当方で処理を検討してみました。
ASP.NET MVC自体何なのかあまりよくわかっていませんが、
ちょっと無理やりではありますが、意図する動きに近いもの(コピーしたObjが増える)ができたかもしれません。
※各クラスは簡略化しています。
※ASP.NET MVCはVS2015で作成した標準のものに追加する形で実装しています。

  • CopyController.cs

C#

1namespace tera45228.Models { 2 public class CopyViewModel { 3 public List<Item> Items { get; set; } 4 public CopyViewModel() { 5 Items = new List<Item>(); 6 } 7 public void Copy(int? index) { 8 var val = index != null ? Items[(int)index].Value : "コピーしたObj,"; 9 var id = 0; 10 if(Items.Count>0) 11 id = Items.Max(i=>i.ID)+ 1; 12 Items.Add(new Item() { ID=id, Value = val }); 13 } 14 } 15 public class Item { 16 public int ID { get; set; } 17 public string Value { get; set; } 18 } 19}
  • CopyViewModel.cs

C#

1namespace tera45228.Controllers { 2 public class CopyController : Controller { 3 // GET: Copy 4 public ActionResult Index() { 5 var vm = new CopyViewModel(); 6 vm.Items.Add(new Item() { ID = 1, Value = "First" }); 7 vm.Items.Add(new Item() { ID = 2, Value = "Second" }); 8 vm.Items.Add(new Item() { ID = 3, Value = "Third" }); 9 return View(vm); 10 } 11 12 [HttpPost] 13 public ActionResult Index([Bind(Include = "Items")] CopyViewModel vm,FormCollection form) { 14 var tmp1 = form["Item.ID"].ToString().Split(new[] { "," }, StringSplitOptions.None); 15 var tmp2 = form["Item.Value"].ToString().Split(new[] { "," }, StringSplitOptions.None); 16 //vmはnew されてるので値を入れなおさないといけないっぽい 17 for(int i = 0; i < tmp1.Length; i++) { 18 vm.Items.Add(new Item() { ID = int.Parse(tmp1[i]), Value = tmp2[i] }); 19 } 20 vm.Copy(null); 21 return View(vm); 22 } 23 } 24} 25
  • Index.cshtml

cshtml

1@model tera45228.Models.CopyViewModel 2@using tera45228.Models; 3@{ 4 ViewBag.Title = "Index"; 5} 6 7<h2>Index</h2> 8 9<p> 10 @Html.ActionLink("Create New", "Create") 11</p> 12@using(Html.BeginForm()){ 13 @Html.AntiForgeryToken() 14 foreach(Item item in Model.Items) { 15 <div class="form-group"> 16 @Html.HiddenFor(Item => item.ID) 17 @Html.TextBoxFor(Item => item.Value) 18 19 <input type="submit" value="Copy" /> 20 </div> 21 } 22}

ViewModelを維持しつつItemをAddするだけで実装できそうなのですが、
やってみたらできなかったため、苦肉の策でformから値を配列可し、Itemsを構築しています。
値は「,」区切りなのですが単純に「,」でSplitするとだめなので工夫が必要だと思います。

投稿2016/11/17 20:30

Hey_CH

総合スコア437

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問