0

ビューモデルの理解と実装に問題があります。たとえば、各 Blog オブジェクトが 1 つのブログ投稿を表す Blog オブジェクトがあるとします。各ブログのリスト (タイトル、テキスト、投稿日など) を含むビューがあります。現在、ブログ オブジェクトのリストをビューに渡していますが、BlogViewModel オブジェクトのリストをビューに渡したいと考えています。どうすればいいのですか?ビューモデルを理解するのに役立つ良いリソースはありますか?

編集 渡したい BlogViewModel には、ブログのタイトルとテキストの省略フィールドが含まれます。たとえば、タイトルの最初の 10 文字とテキストの最初の 25 文字だけを表示したい。

4

1 に答える 1

2

あなたが現在次のようなことをしていると仮定します:

public ActionResult GetBlogs()
{
    var someService = new FooService();
    var blogs = someService.GetMeMyBlogs();
    return View("bloglist", blogs); 
}

ビューモデルを使用するには、サービスからモデルを返すか、ビューに送信する前にコントローラーでオブジェクトを変換する必要があります。

Blog1つのオプションは、オブジェクトの拡張メソッドを作成することです。

次のようなプロパティがいくつかあるとします。

public class BlogVM
{
    public string Title {get;set;}
    public string Body {get;set;}
    public string AuthorName {get;set;}
    public int Id {get;set;}
}

拡張メソッドを書くことができます:

public static BlogVM ToBlogVM(this Blog source)
{
    return new BlogVM 
    {
         Title = source.Title.SubString(0, 10),
         Body = source.Body.SubString(0, 25),
         AuthorName = source.Author.Name,//assuming you have some kind of Author table, I'm sure you get the idea..
         Id = source.Id
    };
}

これで、コントローラーで次のようなことができます。

public ActionResult GetBlogs()
{
    var someService = new FooService();
    var blogs = someService.GetMeMyBlogs();
    return View("bloglist", blogs.Select(x => x.ToBlogVM())); 
}

BlogVMオブジェクトのリストをビューに渡します。

編集:おそらくViewModelsの理由についていくつかの単語を追加する価値があります。

  • ビューが必要ないのに、なぜすべてをビューに送信するのですか?あなたの例では、あなたの体はテキストの大きなブロックかもしれません。25文字のみを表示する場合は、25文字のみを送信してください

  • オブジェクト内の一部の情報は機密情報である可能性があります。の名前を送信することAuthorもできますが、名前、電子メール、さらにはパスワードやアドレスなど、保持している可能性のある他の情報は送信しないでください。

  • 同様に、POSTシナリオでは、返送される可能性のある情報を制御できます。ユーザーが完全なオブジェクトにPOSTで戻ることを許可すると、予期しない更新されたフィールドが返される可能性があります。VMを使用する場合は、受け入れる情報を制御できます。

  • ビューを構築する方が簡単/迅速だと思います

于 2013-03-08T23:21:34.687 に答える