2

私はWebアプリケーションの設計に取り組んでいます。このアプリケーションは元々私がコーディングしたものではなく、設計作業中にコントローラーやモデルを変更しないように最善を尽くしています。

現時点では、アプリケーションは、現在表示しているプロジェクトの名前とプロジェクトの完了日を表示することになっているヘッダーです。このヘッダーは、レイアウトによって呼び出される部分ビューであり、部分ビューでもあります。ヘッダーはプロジェクト詳細ビューとは別のビューであるため、この情報を引き出すのに非常に苦労しています。

コントローラへの@model参照をヘッダーに追加しようとしましたが、間違ったタイプを渡したというエラーが発生しました(以下のエラーを参照)。

また、ヘッダー(これも)を呼び出すレイアウトビュー内の@Html.Partial呼び出しにモデルを渡そうとしました。一般的に、私が試したすべてのことで、このエラーが発生します。

The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[OST.Pride.Business.Models.Project]', but this dictionary requires a model item of type 'OST.Pride.Web.Models.AdminProjectUserEdit'.

ヘッダーはアプリケーション全体のレイアウトの一部であるため、ヘッダーをプロジェクトの詳細ビューに移動することはできません。私はこれで誰かの助けをいただければ幸いです、私はしばらくそれで立ち往生しています。

レイアウトで呼び出されるヘッダー

<header id="main-header">
  @Html.Partial("LayoutTemplates/Header")
</header>

ヘッダ:

<div class="navbar" style="padding-top:15px;">
    <div class="navbar-inner">  
        <div class="container" style="width:auto;">           
            <div class="project-navbar"> 
                 <h3><ul class="nav pull-left">Customer: TEST </ul></h3>
                 <h3><ul class="nav" style="padding-left:40%;">Project: //This is where the project name needs to be//</ul></h3>
                 <h3><ul class="nav pull-right" align="center">Project Completion Date: //Again, I need to pull the completion date here// </ul></h3>

            </div>
        </div>
    </div>  
</div>

コントローラーの方法

public ActionResult Details(int? projectid, int? ProjectID, int? projectuserid) // based on the project id, populates the view with the roles, project users, and the roles for the screen.
        {
            var model = new Models.AdminProjectUserEdit();

            model.Project = storeDB.Projects.Find(ProjectID);
            model.Users = storeDB.Users.ToList();

            model.Surveys = storeDB.Surveys.Include("SurveyType").ToList();
            model.ProjectUsers = storeDB.ProjectUsers.Include("Project").Include("User").Where(x => x.ProjectID == projectid).ToList();
            return View(model);
        }
4

2 に答える 2

3

ここで考慮すべき点はほとんどありません。これをレイアウト内に配置しているため、これは、アプリケーションのすべてのビューにプロジェクトの詳細が表示されることを意味します。ただし、プロジェクトの詳細を表示するには、最初にプロジェクトが必要です。また、プロジェクトを作成するには、プロジェクトIDが必要です。このロジックに従うと、これは、リクエストごとにプロジェクトIDをどこにでも持っている必要があることを意味します。このプロジェクトIDは、リクエストクエリ文字列またはルートの一部である可能性があります。このデモンストレーションの目的のために、私はそれがルートデータの一部であると仮定します。

したがって、子アクションを使用して、部分ビューの代わりにレイアウト内にプロジェクトの詳細を表示できます。

<header id="main-header">
    @Html.Action("Header", "SomeController", new { projectid = ViewContext.RouteData["projectid"] })
</header>

projectIdルートデータからパラメータを渡す方法に注目してください。プロジェクトIDがクエリ文字列、Cookie、またはそれを永続化することを決定した場所にある場合は、明らかにこのコードを適応させる必要があります。ルートは良い場所のようです。

したがって、プロジェクトをフェッチして対応する部分ビューに渡すコントローラーのHeader子アクションアクションを呼び出します。Some

[ChildAction]
public ActionResult Header(int? projectId)
{
    if (projectId == null)
    {
        return PartialView();
    }
    var project = storeDB.Projects.Find(projectID);
    return PartialView(project);
}

次に、対応するHeader.cshtml部分ビュー内で、プロジェクトの詳細をレンダリングします。

@model Project
@if (Model == null)
{
    // there wasn't any project selected => display some default stuff
    <div>No project to display</div>
}
else
{
    <div class="navbar" style="padding-top:15px;">
        <div class="navbar-inner">  
            <div class="container" style="width:auto;">           
                <div class="project-navbar"> 
                     <h3>
                         <ul class="nav pull-left">
                             Customer: TEST
                         </ul>
                     </h3>
                     <h3>
                         <ul class="nav" style="padding-left:40%;">
                             Project:  
                             @Html.DisplayFor(x => x.Name)
                         </ul>
                     </h3>
                     <h3>
                         <ul class="nav pull-right" align="center">
                             Project Completion Date: 
                             @Html.DisplayFor(x => x.CompletionDate)
                         </ul>
                     </h3>
                </div>
            </div>
        </div>  
    </div>
}
于 2012-07-06T17:19:38.447 に答える
1

ダリンの答えは本当に良いもので、別の状況でもうまくいくかもしれませんが、私は上司からの提案を受けてViewBagを使用することにしました。このメソッドを使用すると、共有ビューであるヘッダーにモデルを渡す必要がなくなります。

このメソッドをコードに実装した方法は次のとおりです。

レイアウトで呼び出されているヘッダー

<header id="main-header">
    @Html.Partial("LayoutTemplates/Header")
</header>

ヘッダ

<div class="navbar" style="padding-top:15px;">
    <div class="navbar-inner">  
        <div class="container" style="width:auto;" >

        @if (@ViewBag.projectName == null)
        { /**do nothing**/ }
        else
        {

            <div class="project-navbar"> 
                 <h3><ul class="nav pull-left">Customer: TEST </ul></h3>
                 <h3><ul class="nav" style="padding-left:40%;">Project: @ViewBag.projectName</ul></h3>
                 <h3><ul class="nav pull-right" align="center">Project Completion Date: @ViewBag.projectCompletion </ul></h3>

           </div>
        } 
        </div>
    </div>  

コントローラーの方法

    public ActionResult Details(int? projectid, int? ProjectID, int? projectuserid) // based on the project id, populates the view with the roles, project users, and the roles for the screen.
    {
        var model = new Models.AdminProjectUserEdit();

        model.Project = storeDB.Projects.Find(ProjectID);
        model.Users = storeDB.Users.ToList();

        model.Surveys = storeDB.Surveys.Include("SurveyType").ToList();
        model.ProjectUsers = storeDB.ProjectUsers.Include("Project").Include("User").Where(x => x.ProjectID == projectid).ToList();
        ViewBag.projectName = storeDB.Projects.Find(ProjectID).ProjectName;
        ViewBag.projectCompletion = storeDB.Projects.Find(ProjectID).ProjectCompletion;
        return View(model);
    }
于 2012-07-06T19:15:55.960 に答える