C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: C# MVC UpdateModelメソッドについて


(過去ログ 135 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■79394 / inTopicNo.1)  C# MVC UpdateModelメソッドについて
  
□投稿者/ vespha (1回)-(2016/03/30(Wed) 05:58:08)

分類:[ASP.NET (C#)] 

以下の環境にてUpdateModelメソッドについて質問をさせていただきます。
開発環境:VS2012 C# MVC3 .NetFrameWrok4 EF4.1

Controllerクラスでは普通にUpdateModelメソッドを使用できるのですが、別クラスにて使用したく
以下のように記述しました。
コントロールクラス
[HttpPost]
public ActionResult Edit()
{
//別クラスのメソッドを呼び出す
  xxxx(this);
}

別クラスのメソッド
public void xxxx(Controller ctr)
{

ctr.UpdateModel();←認識されない
}


別クラスに引数でthisでコントロールを渡し、UpdateModelを使用しようとしたのですが、
認識されない。
まだ、始めたばかりで理解度が低く検討違いなコードかもしれません。
ただ、したいことはコントロールクラスでなく、別のクラスにてUpdateModelメソッドを利用するにはどうすればよいかと
いうことです。
お知恵を拝借したく、よろしくお願い致します。
引用返信 編集キー/
■79398 / inTopicNo.2)  Re[1]: C# MVC UpdateModelメソッドについて
□投稿者/ WebSurfer (879回)-(2016/03/30(Wed) 10:54:26)
No79394 (vespha さん) に返信

> したいことはコントロールクラスでなく、別のクラスにてUpdateModelメソッド
> を利用するにはどうすればよいかということです。

UpdateModel メソッドのアクセス修飾子は protected internal となっていると思
いますが、その「別のクラス」はアクセス可能な範囲に入っているのでしょうか?


#質問する際は局所的な部分だけでなく全体的なシナリオ、やりたいことを書くのが
 いいと思います。そうしてもらえると、その局所的なところはできないけどやりた
 いことはこうすればできるとか、それよりこの方がスマートにできるなど代案が出
 てくるかもしれませんので。
引用返信 編集キー/
■79401 / inTopicNo.3)  Re[2]: C# MVC UpdateModelメソッドについて
□投稿者/ フィール (1回)-(2016/03/30(Wed) 15:58:09)
UpdateModelメソッドのスコープはprotectedなので、そのクラス内でしかアクセスできません。
継承クラスであれば、継承元のprotectedメンバへのアクセスも可能ですが、
サンプルソースから推測するに、別クラスからコントロールクラスのこのメソッドを呼ぶことはできません。

なぜ別クラスから任意コントロールのUpdateModelを行いたいのでしょうか?
引用返信 編集キー/
■79405 / inTopicNo.4)  Re[3]: C# MVC UpdateModelメソッドについて
□投稿者/ vespha (2回)-(2016/03/31(Thu) 02:44:32)
No79401 (フィール さん) に返信
> UpdateModelメソッドのスコープはprotectedなので、そのクラス内でしかアクセスできません。
> 継承クラスであれば、継承元のprotectedメンバへのアクセスも可能ですが、
> サンプルソースから推測するに、別クラスからコントロールクラスのこのメソッドを呼ぶことはできません。
>
> なぜ別クラスから任意コントロールのUpdateModelを行いたいのでしょうか?

返信ありがとございます。
別のクラスからUpdateModelを使いたかったのはDBへの更新などの処理をコントロールクラスではなく別のクラス(ビジネスロジック)で
完了させたいと思ったからです。UpdateModelに引き続きSaveChangesメソッドにてDBに確定する処理もコントロールクラスで行うのに
違和感があり、別クラスにて使用できないかと思ったためです。
ただ、protectedメンバということで別のクラスに継承させるのは、それはそれでちょつと違うとも思います。
やはり、コントロールクラスでさせるべきなのですかね。 その辺のクラスへの処理の切り分けはどうしているのでしょうか。
再度のご質問となり恐縮ですが、どのように切り分けるのが良いか再度のアドバイスをいただければ。。。
漠然とした質問でもうしわけありません。
引用返信 編集キー/
■79486 / inTopicNo.5)  Re[4]: C# MVC UpdateModelメソッドについて
□投稿者/ WebSurfer (885回)-(2016/04/07(Thu) 15:33:39)
No79405 (vespha さん) に返信

自分の関わったスレッドがこのまま放置で終わってしまっては何なので一言・・・

> その辺のクラスへの処理の切り分けはどうしているのでしょうか。

スキャフォールディング機能を使って作る時のように分ければいいと思います。

ちなみに、Visual Studio 2010 を使って、AdventureWorksLT サンプルデータベースから 
DB First で EDM を作り、それをベースにスキャフォールディング機能を利用してコント
ローラーとビューを自動生成させると、質問者さんのコードに該当する Edit アクション
メソッドは以下のようになります。

モデル(ビジネスロジック)のクラスの初期化、POST されてきたパラメータの引渡し、
DB を更新するためのメソッドの起動はコントローラーのアクションメソッドで行なわれ
ています。

それら別のクラスに移す意味はなさそうです。というより、開発工数や保守性を考えたら、
そんなことはすべきでないと思います。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using AdventureWorksLT;

namespace Mvc4App.Controllers
{
    public class Address2Controller : Controller
    {
        private AdventureWorksLT_DataEntities db = new AdventureWorksLT_DataEntities();

        // ・・・中略・・・

        [HttpPost]
        public ActionResult Edit(Address address)
        {
            if (ModelState.IsValid)
            {
                db.Address.Attach(address);
                db.ObjectStateManager.ChangeObjectState(address, EntityState.Modified);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(address);
        }

        // ・・・中略・・・
    }
}


ちなみに、

db.Address.Attach(address);
db.ObjectStateManager.ChangeObjectState(address, EntityState.Modified);
db.SaveChanges();

は、

var address = (from a in db.Address
               where a.AddressID == id
               select a).FirstOrDefault<Address>();
UpdateModel<Address>(address);
db.SaveChanges();

と同じ結果になります。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -