0

是否可以为同一个 url 使用两个不同的控制器?

这是必需的,因为我需要 URL 始终保持不变,但它应该使用不同的控制器。我的控制器(Apples,Bananas等)和视图被分离到每个自己的项目中。

我需要在我的主 MVC 项目中执行一个操作,以根据某些逻辑从Bananasor项目返回一个操作/视图。Apples

那么我将如何继续使用相同的 url 但从不同的控制器返回操作/视图?

我正在使用 MVC 4

4

2 回答 2

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 回答
0

您的 URL 应该是选择控制器的逻辑所在。也许您需要重新组织您的项目以拥有一个控制器并将其他逻辑放入控制器操作中以填充模型?

但是,如果您坚持走这条路线,您可能需要在 中重写CreateControllerDefaultControllerFactory这是实例化您的控制器的类,通常基于您的控制器名称。这是我的一个项目中的一个示例:

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 回答