4

私はMVC3とC#を初めて使用します。

これが私の現在のモデルです

@model Reports.ViewModels.ContentViewModel
<div>Total Hours: </div>

foreach (var user in Model.Users.ToList()) {
   @Html.Partial("_DirectReports", user)
}

これはうまく機能しています。次に、これらの部分ビューにHTMLがあり、別の@modelを使用して必要なものすべてをレンダリングします。問題は、すべてのデータを一緒に追加したいということです。

foreachの外部に変数を作成したいforeachはデータを変数に挿入し、foreachが完了した後にデータを返します。

@model Reports.ViewModels.ContentViewModel

@{var Total = 0}
foreach (var user in Model.Users.ToList()) {
   @Html.Partial("_DirectReports", user)
   //@Total is assigned a value in the partial view
}

<div>Total Hours: @Total</div>

これが可能であれば、それは素晴らしいことです

4

3 に答える 3

5

ここでは、ロジックとビューを混ぜ合わせて滑りやすい坂道を下っています。MVC は、さまざまなレイヤー (モデル、ビュー、およびコントローラー) 間の結合を減らして、特にコードの保守とテストを容易にするように設計されています。

それでは、それを少しきれいにしてみましょう。まず、Totalはデータの一部であり、モデルの一部である必要があることを意味します。

public class ContentViewModel 
{
    public List<User> Users { get; set; }
    public int TotalHours
    {
        get
        {
            return Users.Sum(u => u.Hours); // Assuming User has an Hours property
        }
    }
}

コントローラーは、モデルの作成とデータの提供を処理する必要があります。このようなもの:

public ActionResult Index()
{
    ContentViewModel viewModel = new ContentViewModel();
    viewModel.Users = db.Users.ToList();

    return View(viewModel);
}

必要なデータが揃ったので、ビューで現在使用している多くのロジック (foreach やTotalvar の使用など)を削減できます。

@model Reports.ViewModels.ContentViewModel

@Html.DisplayFor(m => m.Users)

<div>Total Hours: @Model.TotalHours</div>

Html.DisplayForHtml.EditorFor表示/エディター テンプレートと呼ばれるものを使用すると、コレクションを自動的にループして、各アイテムのテンプレートをレンダリングします。でこれを利用するにはContentViewModel、表示テンプレートを作成する必要があります。これを行うには、ビューがある場所の下にフォルダーを作成し、名前を付ける必要がありますDisplayTemplates。たとえば、ビューが~/Views/Home/Index.cshtmlの場合、フォルダを作成する必要があります: ~/Views/Home/DisplayTemplates

そのフォルダーを右クリックして、新しいビューを追加します。表示されるダイアログ ボックスで、厳密に型指定されたビューを作成し、テンプレートに渡したい型を選択して (私の例でUserは型ではなくList<User>)、それを部分ビューにして、必ずそれを指定します。タイプと同じ名前 (再びUser)。テンプレートを作成したら、通常のビューと同じように HTML ヘルパーを使用できます。このようなもの:

@model Models.User

@Html.LabelFor(m => m.Name)
@Html.DisplayFor(m => m.Name)

これで、扱いやすいチャンクに分割されました。表示/エディタ テンプレートの使用について詳しく知りたい場合は、このテーマに関する Brad Wilson の記事シリーズを読むことを強くお勧めします。MVC 2 用に書かれていますが、それでも適用されます。

于 2012-08-08T18:49:01.350 に答える
4

MVC パターンに責任が混在しているのではないかと心配しています。それがあなたがこれに苦労している理由です。ビューモデルを使用する必要があります。これは、ビューで処理する必要があるものではありません。そのため、ビュー モデルでTotalプロパティを定義し、コントローラー アクションに値を割り当てるジョブを実行させるだけです。ContentViewModelその後:

@model Reports.ViewModels.ContentViewModel

foreach (var user in Model.Users.ToList()) {
   @Html.Partial("_DirectReports", user)
}

<div>Total Hours: @Model.Total</div>

ASP.NET MVC では、何かを計算するのはビューの責任ではありません。ビューの役割は、ビュー モデルの形式で準備中のデータのみを表示することです。

于 2012-08-08T18:21:23.110 に答える
2

Here is what you wanted.

@model Reports.ViewModels.ContentViewModel

@{
int Total = 0;
foreach (var user in Model.Users.ToList()) {
   @Html.Partial("_DirectReports", user)
   //@Total is assigned a value in the partial view
   Total = 5;
}

<div>Total Hours: @Total</div>
}

would give : Total Hours: 5

于 2012-08-08T18:22:04.103 に答える