2

ビューでデータベースを使用するのは悪い習慣であることはわかっています。ただし、Userオブジェクトも渡しているので、どうすれば使いやすくできるのだろうか。

Ruby On Rails での動作が気に入っています。@instance_variableinを作成しbefore_filter、コントローラーとビューから呼び出すだけです。

ただし、ASP.NET MVC ではこれを行うことはできません。そこで、ビューに渡す必要があるすべてのデータ (DataContext と User) を含むクラスを作成しました。

public class XData
{
    public DBDataContext DB { get; set; }
    public User User { get; set; }
}

コントローラーの Initialize メソッドで、すべてのデータを取得します。

public XData X;

protected override void Initialize(RequestContext requestContext)
{
    base.Initialize(requestContext);

    X = new XData();

    X.DB = ...;
    X.User = ....;
}

素晴らしい作品: 次のようにビューからデータベース オブジェクトを取得できます。

<%= Model.X.DB.Users.First().Name %>

データをビューに渡すには、次のことを行う必要があります。

    public ActionResult Foo()
    {
        return View(new FooModel
                        {
                            X = X,
                            HelloMessage = "Hello world!"
                        });
    }

ここで私が気に入らないのは、常にそのことを書かなければならないX = Xことです。それを自動的に初期化するにはどうすればよいですか?

ありがとう

4

3 に答える 3

1

多くのコントローラーが同様のモデルを返し、カスタマイズが少ないという同様の問題を見てきました。この場合、他のモデルが派生する抽象ベース モデルと、必要な特定のモデルを返す関数をベースX = Xなどを設定して作成します。

たとえば、次のように考えてください。

public abstract class MyBaseModel
{
    public User User { get; set; }
}

public class FooModel : MyBaseModel
{
    public string FooMessage { get; set; }
}

public class BarModel : MyBaseModel
{
    public string BarMessage { get; set; }
}

public class MyController : Controller
{
    public ActionResult Foo()
    {
        var model = this.GetModel<FooModel>();

        // Set the properties on FooModel.
        model.FooMessage = "Hello world!"

        return View(model);
    }

    public ActionResult Bar()
    {
        var model = this.GetModel<BarModel>();

        // Set the properties on BarModel.
        model.BarMessage = "Hello world 2!"

        return View(model);
    }

    protected T GetModel<T>() where T : MyBaseModel, new()
    {
        T model = new T();

        // Set the properties on MyBaseModel.
        model.User = ...;

        return model;
    }
}

MyBaseModel多くのコントローラー間で共有したい場合は、理想的には依存性注入を介して、各コントローラーに提供されるまたは同様のものGetModelに抽出します。ModelProvider

于 2010-09-25T20:27:03.487 に答える
1

X を ViewData に配置し、HtmlHelper 拡張メソッドを記述して X にアクセスする、コントローラーの View メソッドをオーバーライドして、コントローラーのすべてのインスタンス プロパティをモデルの名前が一致するプロパティにマップする小さなリフレクション ロジックを追加できます (Automapper は可能だと思います)。ここで助けて...)

于 2010-09-25T19:47:48.107 に答える
-1

ビューを強く型付けすることから始める必要があると思います:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Namespace.XData>" %>

そしてあなたのコントローラーで:

 public ActionResult Foo()
    {
        var X = new XData();
        X.User = ....;
        X.SomeProperty = ...;
        X.Message = "Hello world!";
        return View(X);
    }

これにより、次のようにビュー内のオブジェクトにアクセスできます。

<%: Model.User.UserName %>
<%: Model.Message %>
于 2010-09-25T20:22:03.497 に答える