0

同じ URL に 2 つの異なるコントローラーを使用することは可能ですか?

これは、URL を常に同じにする必要があるため必要ですが、別のコントローラーを使用する必要があります。コントローラー ( ApplesBananasなど) とビューは、それぞれ独自のプロジェクトに分かれています。

いくつかのロジックに応じて、Bananasまたはプロジェクトからアクション/ビューを返すために、メイン MVC プロジェクトにアクションが必要です。Apples

では、常に同じ URL を持ちながら、異なるコントローラーからのアクション/ビューを返すにはどうすればよいでしょうか?

私はMVC 4を使用しています

4

2 に答える 2

0

URLは、コントローラーを選択するためのロジックがある場所にある必要があります。たぶん、プロジェクトを再編成して単一のコントローラーを持ち、モデルを埋めるために他のロジックをコントローラーアクションに入れる必要がありますか?

ただし、このルートを使用する場合は、でオーバーライドする必要がありますCreateControllerDefaultControllerFactoryこれは、通常はコントローラー名に基づいて、コントローラーをインスタンス化するクラスです。これが私のプロジェクトの1つの例です:

public class ErrorHandlingControllerFactory : DefaultControllerFactory
{
    /// <summary>
    /// Injects a custom attribute
    /// on every action that is invoked by the controller
    /// </summary>
    /// <param name="requestContext">The request context</param>
    /// <param name="controllerName">The name of the controller</param>
    /// <returns>An instance of a controller</returns>
    public override IController CreateController(
        RequestContext requestContext,
        string controllerName)
    {
        var controller =
            base.CreateController(requestContext,
            controllerName);

        var c = controller as Controller;

        if (c != null)
        {
            c.ActionInvoker =
                new ErrorHandlingActionInvoker(
                    new HandleErrorWithELMAHAttribute());
        }

        return controller;
    }
}

既知のコントローラー名(恐ろしいマジックストリング...)を渡すようにルートを設定し、このコントローラー名をテストし、検出された場合はロジックを実行して実際のコントローラー名を取得し、これをに渡す必要がありbase.CreateControllerます。

于 2013-03-18T11:53:42.817 に答える
0

これらのコードを書きました。お役に立てば幸いです。どのメソッドが実行されるかを理解するために隠しフィールドを使用しました。

これらは私のモデルです:

namespace MvcSameController.Models
{
    public class RouteModel
    {
        public SampleModel1 SampleModel1 { get; set; }
        public SampleModel2 SampleModel2 { get; set; }
    }

    public class SampleModel1
    {
        public int Id { get; set; }
        public string Name { get; set; }

    }

    public class SampleModel2
    {
        public int Id { get; set; }
        public string Surname { get; set; }

    }
}

これはコントローラーです:

using System.Web.Mvc;
using MvcSameController.Models;

namespace MvcSameController.Controllers
{
    public class SameController : Controller
    {
        //
        // GET: /Same/

        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public void Index(RouteModel routeModel, string type)
        {

            if (type == "1")
            {
                //Code for type 1
            }

            else if (type == "2")
            {
                //Code for type 2
            }

        }
    }
}

とビュー:

@{
    ViewBag.Title = "Index";
}
@model MvcSameController.Models.RouteModel


    <section id="loginForm">
        <h2>Type1 </h2>
        @using (Html.BeginForm())
        {
            @Html.AntiForgeryToken()
            @Html.ValidationSummary(true)

            @Html.Hidden("type",1)

            <fieldset>
                <legend>Type1 Form</legend>
                <ol>
                    <li>
                        @Html.LabelFor(m => m.SampleModel1.Name)
                        @Html.TextBoxFor(m => m.SampleModel1.Name)
                        @Html.ValidationMessageFor(m => m.SampleModel1.Name)
                    </li>
                </ol>
                <input type="submit" value="Run Method1" />
            </fieldset>
        }
    </section>

    <section id="loginForm">
        <h2>Type2</h2>
        @using (Html.BeginForm())
        {
            @Html.AntiForgeryToken()
            @Html.ValidationSummary(true)
             @Html.Hidden("type",2)
            <fieldset>
                <legend>Type2 Form</legend>
                <ol>
                    <li>
                        @Html.LabelFor(m => m.SampleModel2.Surname)
                        @Html.TextBoxFor(m => m.SampleModel2.Surname)
                        @Html.ValidationMessageFor(m => m.SampleModel2.Surname)
                    </li>
                </ol>
                <input type="submit" value="Run Method2" />
            </fieldset>

        }
    </section>

ここから私のサンプルをダウンロードできます

于 2013-03-18T21:24:31.493 に答える