4

ASP.NET MVCはかなり新しいので、コードの再利用と保守性の面ですでにいくつかの利点があります。ルーティングについて前の質問をしたとき、私の例について別のアイデアがありましたが、それを実装する方法がわかりません。

質問:課題ビューとコントローラーを別々のページで再利用したり、特定のもの(表示する課題の数など)のパラメーターを設定したりするにはどうすればよいですか?

例: Webアプリケーションで、問題のリストを表示したいとします。これらの問題はプロジェクトごとにグループ化されています。したがって、www.example.com / projectname / issuesにアクセスすると、そのプロジェクトの問題のリストが表示され、www.example.com / issuesにアクセスすると、すべてのプロジェクトのすべての問題が表示されます。私がやりたいのは、www.example.com / projectnameにアクセスすると、提出された最後の10の問題を含む、そのプロジェクトに関する情報が表示されることです。

この問題コードを再利用するにはどうすればよいですか?パーシャルビューのオプションがあるようですが、それを実装したとき、コードをどのようにルーティングするかがわかりませんでした。Webフォームでは、ASP.netコントロールを作成し、コードビハインドにいくつかのパラメーターを設定してから、このコントロールを別の場所に埋め込むことができます。

これまでに見つけた例のいくつかは、完全な実装がない(他のページにHTM1を追加するだけではない)か、ASP.NET MVC 3では機能しないように見える古いMVCコードのように見えるか、許可されていないかのいずれかです。パラメータを設定し、このタイプの再利用を示します。

私の用語はここでは完全に正しくないかもしれません。どちらかといえば、 ASP.net Webフォームユーザーコントロールのようなものを複製するための最良の(MVCを読む)方法を見つけようとしています。のように、「マスター」問題リストと問題「ウィジェット」の両方で「問題」コード(HTMLおよびC#)を再利用します。

4

3 に答える 3

4

外に出て、それ自体でデータにアクセスするビューでの誘惑的な書き込みコードをスキップします。これには、RenderAction などの組み込み関数の使用が含まれます。RenderAction が別のコントローラーを実行するために「戻る」とはいえ、ビューがそれ自体でアクションを実行していないという意味ではありませ。ニーズを見る。

代わりに、課題リストを含むプロパティを含む課題リスト ページのモデルを送り返すことができます。

public class IssueListModel {
    public List<Issue> Issues { get; set; }
}

課題リスト アクションに入力します。

public ActionResult IssueList(string projectName) // projectName may be null
{
    var issueListModel = new IssueListModel();

    issueListModel.Issues = SomeRepository.GetIssues(projectName); // whatever you need to send...


    return View(issueListModel);
}

次に、リストページでループすることができます:

@foreach (var issue in Model.Issues) {
    <div>@issue.IssueName</div>
}

または、Issue コレクションを部分ビューに送信することもできます。

@Html.RenderPartial("IssueList", Model.Issues)

リストをモデルとして期待する部分ビューを入力できます。

@model List<MyProject.Models.Issue>

...そして部分ビューでそれをループし、今回はモデル自体で foreach を実行します:

@foreach (var issue in Model) {
    <div>@issue.IssueName</div>
}

次に、問題を含むプロパティも含むプロジェクト詳細ビュー用に別のモデルを作成することができます。

public class ProjectDetailModel {
    public Project Project { get; set; }
    public List<Issue> Issues { get; set; }
    public string Whatever { get; set; }
}

コントローラーでは、リストコントローラーに入力するのと同じ関数を使用して、このリストに入力できます。

public ActionResult ProjectDetail(string projectName)
{
    var projectDetailModel = new ProjectDetailModel();

    projectDetailModel.Issues = SomeRepository.GetIssues(projectName, 10); // whatever you need to send


    return View(projectDetailModel);
}

次に、 ProjectDetail ビューでまったく同じ部分ビューを再利用できます。

@Html.RenderPartial("IssueList", Model.Issues)

長い答えですが、これがあなたが探していたものであることを願っています!

于 2012-05-17T03:49:08.660 に答える
3

プレゼンテーションロジックのみを再利用する場合は、部分ビューを使用できます。コントローラのロジックも再利用する場合は、部分ビューと組み合わせて子アクションを使用する必要があります。

コントローラを作成する

public class IssuesController : Controller
{
    [ChildActionOnly]
    public PartialViewResult List(string projectName, int issueCount = 0)
    {
        IEnumerable<Issue> issueList = new List<Issue>();

        // Here load appropriate issues into issueList

        return PartialView(issueList);
    }
}

また、Issuesフォルダ内にListという名前の適切な部分ビューを作成することも忘れないでください。

最後に、プロジェクトビュー内でこの行を使用します

@{ Html.RenderAction("List", "Issues", new { projectName = "Px", issueCount = 10 } ); }

課題リストビュー内のこの行

@{ Html.RenderAction("List", "Issues", new { projectName = "Px" } ); }
于 2012-05-16T21:44:05.017 に答える
0

コントローラーメソッドでは、View() だけでなく、名前付きのビューを返します

つまり...

public ViewResult IssueView1()
{ return View("Issue");}

public ViewResult IssueView2()
{return View("Issue");}
于 2012-05-16T20:04:10.837 に答える