3

mvc プロジェクトでモデルを管理する最良の方法に関連する 2 つの質問があります。

  • モデルを初期化するためにコンストラクターを使用できますか (明らかに関連するロジックを使用して)?
  • この目的には、「コンストラクター方式」を使用する方が良いですか、それとも、新しいモデル インスタンスの作成後にコントローラーによって呼び出される拡張メソッドを使用する必要がありますか?

たとえば、連絡先フォームのモデルがあります。ユーザーは、匿名、クライアント、またはサプライヤーの 3 つの役割を持つことができ、各状態でフォームを送信できます。私が望む唯一のことは、ユーザーがログインしている場合(クライアントの役割やサプライヤーの役割など)、テキストボックスに彼のデータをプリロードしたいということです。これを行うために、私はこのコードを書きました:

using System;
using System.Web;
using System.Web.Security;
using DrOkR2.Bll.Managers;

namespace DrOkR2.WebFront.Models
{

    public class RequestModel
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Phone { get; set; }
        public string Email { get; set; }
        public string Prov { get; set; }
        public string Request { get; set; }
        public bool UsageConditions { get; set; }

        public RequestModel()
        {
            if (!HttpContext.Current.User.Identity.IsAuthenticated) return;
            if (HttpContext.Current.User.IsInRole("Client"))
            {
                var guid = (Guid)Membership.GetUser().ProviderUserKey;
                var manager = new ClientManager();
                var client = manager.GetClient(guid);
                client.Email = Membership.GetUser().Email;

                FirstName = client.FirstName;
                LastName = client.LastName;
                Email = client.Email;
                Phone = client.Phone;
                Prov = client.Prov;
            }
            else if (HttpContext.Current.User.IsInRole("Supplier"))
            {
                var guid = (Guid)Membership.GetUser().ProviderUserKey;
                var manager = new SupplierManager();
                var supplier = manager.GetSupplier(guid);
                supplier.Email = Membership.GetUser().Email;

                FirstName = supplier.FirstName;
                LastName = supplier.LastName;
                Email = supplier.Email;
                Phone = supplier.PrimaryPhone;
                Prov = supplier.BusinessProv;
            }
        }
    }
}

それは完全に機能しますが、私の質問は次のとおりです。私は可能な限り最善の方法を使用していますか?

4

3 に答える 3

5

いいえ、モデルに依存しHttpContextたり、モデル内のデータ アクセスを行ったりするべきではありません。モデルバインディングに関するあらゆる種類の問題に直面しています(密結合は言うまでもありません)。

コントローラー、またはコントローラーで使用されるリポジトリでモデル プロパティを設定します。

public ActionResult Contact(string id)
{
   var client = _repository.GetClient(id);
   var model = new RequestModel(){ /* set your properties from client */ };

   return View(model);
}
于 2012-08-24T14:41:17.200 に答える
1

あなたのビュー モデルには、私の好みではビジネス ロジックが多すぎます。また、ビューモデルをあなたと結合していますが、HttpContextこれは良い考えではありません。

その種の初期化はコントローラーに属します。

public class RequestModel
{
    public string FirstName { get; set; }
    ....
}

public ActionResult ContactForm(...)
{
    var contactModel = new RequestModel();  
    if (User.IsInRole("Client"))
    {
        ...
    } 
    else if (User.IsInRole("Supplier"))
    {
        ...
    }

    return View(contactModel);
}
于 2012-08-24T14:41:56.117 に答える
0

私はこれを実現しました。スレッドを完成させるために、ここに入れました。なにか提案を?モデル:

public class RequestModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }
    public string Prov { get; set; }
    public string Request { get; set; }
    public bool UsageConditions { get; set; }

    public RequestModel(DrOkUser user )
    {

        if (user == null) return;
        var type = user.GetType().Name;         //Client o Supplier
        Email = user.Email;
        if (type == "Client")
        {
            FirstName = ((Client)user).FirstName;
            LastName = ((Client)user).LastName;
            Phone = ((Client)user).Phone;
            Prov = ((Client)user).Prov;
        }
        if (type == "Supplier")
        {
            FirstName = ((Supplier)user).FirstName;
            LastName = ((Supplier)user).LastName;
            Phone = ((Supplier)user).PrimaryPhone;
            Prov = ((Supplier)user).BusinessProv;
        }
    }
}

コントローラーメソッド:

public class HomeController : BaseController
{
 public ActionResult Assistance()
    {
        var user = GetCurrentUser();
        var mdl = new RequestModel(user);
        return View(mdl);
    }
}

および BaseController:

public class BaseController : Controller
{
 public DrOkUser GetCurrentUser()
    {
        if (!HttpContext.User.Identity.IsAuthenticated) return null;
        DrOkUser user = null;
        var guid = (Guid)Membership.GetUser().ProviderUserKey;
        if (HttpContext.User.IsInRole("Client"))
             user = ClientManager.GetClient(guid);
        if (HttpContext.User.IsInRole("Supplier"))
            user = SupplierManager.GetSupplier(guid);

        user.Email = Membership.GetUser().Email;            
        return user;
    }

}

于 2012-08-24T16:12:49.323 に答える