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

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

ただいまの
回答率

88.93%

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,544

4u4me

score 50

前提・実現したいこと

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

0

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

  • CopyController.cs
namespace tera45228.Models {
    public class CopyViewModel {
        public List<Item> Items { get; set; }
        public CopyViewModel() {
            Items = new List<Item>();
        }
        public void Copy(int? index) {
            var val = index != null ? Items[(int)index].Value : "コピーしたObj,";
            var id = 0;
            if(Items.Count>0)
            id = Items.Max(i=>i.ID)+ 1;
            Items.Add(new Item() { ID=id, Value = val });
        }
    }
    public class Item {
        public int ID { get; set; }
        public string Value { get; set; }
    }
}
  • CopyViewModel.cs
namespace tera45228.Controllers {
    public class CopyController : Controller {
        // GET: Copy
        public ActionResult Index() {
            var vm = new CopyViewModel();
            vm.Items.Add(new Item() { ID = 1, Value = "First" });
            vm.Items.Add(new Item() { ID = 2, Value = "Second" });
            vm.Items.Add(new Item() { ID = 3, Value = "Third" });
            return View(vm);
        }

        [HttpPost]
        public ActionResult Index([Bind(Include = "Items")] CopyViewModel vm,FormCollection form) {
            var tmp1 = form["Item.ID"].ToString().Split(new[] { "," }, StringSplitOptions.None);
            var tmp2 = form["Item.Value"].ToString().Split(new[] { "," }, StringSplitOptions.None);
            //vmはnew されてるので値を入れなおさないといけないっぽい
            for(int i = 0; i < tmp1.Length; i++) {
                vm.Items.Add(new Item() { ID = int.Parse(tmp1[i]), Value = tmp2[i] });
            }
            vm.Copy(null);
            return View(vm);
        }
    }
}
  • Index.cshtml
@model tera45228.Models.CopyViewModel
@using tera45228.Models;
@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
@using(Html.BeginForm()){
    @Html.AntiForgeryToken()
    foreach(Item item in Model.Items) {
        <div class="form-group">
            @Html.HiddenFor(Item => item.ID)
            @Html.TextBoxFor(Item => item.Value)

            <input type="submit" value="Copy" />
        </div>
    }
}


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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

同じタグがついた質問を見る