🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

ASP.NET

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

Q&A

解決済

2回答

1868閲覧

ASP.NET HTMLヘルパーのプロパティを動的に指定したい

firstbiz

総合スコア60

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

ASP.NET

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

0グッド

0クリップ

投稿2019/12/08 07:34

ASP.NET COREのHTMLヘルパーまたはタグヘルパーについて質問です。

ViewModelを使い、複数のモデルをviewで扱えるようにしました。

あるときはAモデルのxプロパティを、あるときはBモデルのxプロパティを使用して、タグを生成したいと思います。

@Html.TextBoxFor(model => model.A.x); または @Html.TextBoxFor(model => model.B.x);

if文で分けるのは容易ですが、大量に存在する場合のために、HTMLヘルパーで指定するモデル&プロパティを、動的に指定する方法はありませんでしょうか?

以下のような「タグヘルパー」を使用する前提でも結構です。

<input type="text" asp-for="@Model.A.x"> または <input type="text" asp-for="@Model.A.x">

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/12/08 23:24

前のスレッドの質問同様、具体的なことが書いてなくて、アドバイスできないです。 Model のコードの具体例、どこで何を見てどのタイミングでどのように使い分けるか、モデルバインディングをどうしたいか等々を書けませんか?
workaholist

2019/12/10 09:22

AとBを動的に切り替える条件はどこに記述したいのですか?
退会済みユーザー

退会済みユーザー

2019/12/11 00:29

上のコメントに答える気はないのですか? 放置はマナーとして NG ですよ。
firstbiz

2019/12/11 03:23

運営の方ですか?
退会済みユーザー

退会済みユーザー

2019/12/11 03:29

あなたは基本的なマナー分からない人と理解しました。
firstbiz

2019/12/11 03:34

ご丁寧に、私に対する見解を教えていただきありがとうございます。
firstbiz

2019/12/11 03:35

worlaholistさん どこでもいいです。
guest

回答2

0

すいません。
返信コメント欄に書くべき内容を投稿してしまいました。

投稿2019/12/12 00:07

編集2019/12/12 00:09
workaholist

総合スコア559

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

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

0

自己解決

無理っぽいので、以下のようにしました。

◆View用のモデルを作り、表示時には、本来のモデル(モデルバインドされた)からView用モデルに値を全コピー
◆保存時には逆に、View用モデルから本来のモデルに値を全コピー

投稿2019/12/11 03:37

firstbiz

総合スコア60

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

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

workaholist

2019/12/12 00:08

それが許されるならAとBを内包するCモデル作ればいいだけでは?
firstbiz

2019/12/18 04:54

そうしたつもりですが、ちょっと違うのですか?
workaholist

2019/12/18 10:15

「View用のモデル=ABを含むC」とすれば「全コピー」する必要がないと思います。 どういう実装をされたのかわからないので想像上で全て回答しています。
firstbiz

2019/12/18 23:50

それだとViewでは「C.A.Name」のように、CモデルのAモデルの「名前」のように記述する必要がありますよね。 <input asp-for="@Model.C.A.name" /> Bモデルが必要な場合にはIF文でわける必要が出てくるかと思います。 Cに全コピーすれば常に <input asp-for="@Model.C.name" /> でいけます。
workaholist

2019/12/19 00:01 編集

そのような実装をしたと初めて伺いましたし、 その「IF文」をどこに書いているのかわからないので全て想像上の回答となります。 (Model.C.nameにA.name、B.nameを代入するかは結局IF文で書いているのでは?想像ですが) Viewなのか、Cなのか、ビジネスロジックなのか、コントローラなのか。 解決されたようでこれ以上は意味がないのでこれで最後とさせていただきます。
firstbiz

2019/12/19 01:52

まさかIF文をViewで書くことをお勧めしないと思います。 当然Controllerで書く方が見やすいですよね。 だからそうしました。
workaholist

2019/12/19 01:57 編集

最後にすると言いましたがすみません。 質問からは「IF文を書きたくないからオブジェクト指向のテクニックで動的に自動で変わる仕組みを作りたい」と読みました。 ではなく「ViewにはIF文を書きたくない、それ以外ならどこでもいいけど」だったのですね。 だとするとやはり先日も書いたとおり「AとBを内包するCモデル」を作ってC.nameのGetterにIF文を書けばコピーいらないですよね。
firstbiz

2019/12/19 02:09

Getterに書く?そんな方法があるのですか? 1. C.mode にAと使うかBを使うかをセット 2.viewにC.nameと書き、Getterでは上記modeを確認し、AまたBのnameを返す ですか?
workaholist

2019/12/19 02:30 編集

CにAとBを内包させれば、CのnameプロパティのGetterにIf文書いて、C.A.nameをreturnするかC.B.nameをreturnするか書けません? これってASP.NETとかMVCとか関係ない、ただのプロパティの書き方の話ですよね?
workaholist

2019/12/19 04:23 編集

class A { public string Name { get; set; } } class B { public string Name { get; set; } } class C { public C(A a, B b, bool useA) { _a = a; _b = b; _useA = useA; } private A _a = null; private B _b = null; private bool _useA = false; public string Name { get { return _useA ? _a.Name : _b.Name; } } }
firstbiz

2019/12/19 13:55

実はこれだと駄目なんです。 明細行があるのですがたとえば asp-for"Course[i].Name" のように、添字で書く必要があり、さらにきちんとモデル名を明記しなければなりません。 かなり悩みました。 こちらが参考になります。 https://qiita.com/Kazunori-Kimura/items/19d595f6fb597101f609
workaholist

2019/12/19 23:44 編集

話が変わってきてますが。 質問の要件は満たしていると思うのですが。 このままシステムが完成するまで話が膨らむのですか?
firstbiz

2019/12/22 23:35

いえ、質問の要件は満たしていないですね。 やってみるとわかります。 asp-for"Course[i].Name" のように添え字を使う必要があるのです。
workaholist

2019/12/23 00:49

質問はAとBをRazorで切り替える方法です。 添字の話は知らないので別の人に聞いてください。
firstbiz

2019/12/23 03:06

いえ、もう解決したのです。
workaholist

2019/12/23 04:19

いや、「無理っぽ」かったんですよね? んで全コピーするっていう元も子もない方法にしたんですよね?
firstbiz

2019/12/23 04:32

いえ、無理だったのです。 アノテーションを記述したモデル名をViewに記述するしかありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問