【问题标题】:Same url but different controllers?相同的网址但不同的控制器?
【发布时间】:2013-03-18 09:20:22
【问题描述】:

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

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

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

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

我正在使用 MVC 4

【问题讨论】:

  • 当用户在浏览器中输入URL时,如果URL相同:你期望MVC如何选择正确的控制器?
  • 您可以使用一个控制器并发送参数如 ?type=apple 或 ?type=bananas 然后在控制器中重定向到其他控制器的操作方法
  • @Øyvind url 路由到主项目中的一个动作,该动作应该有一些逻辑来找出返回哪个控制器/动作。
  • @Müslüm 网址必须相同且不包含查询字符串
  • @ReneK - 操作如何找出URL 是否相同。你打算用什么来区分做什么?形成价值观? http标头?如果您要区分不同的调用,就必须有所不同。

标签: asp.net-mvc-4 asp.net-mvc-routing


【解决方案1】:

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

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

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;
    }
}

您需要设置路由以传递已知的控制器名称(可怕的魔法字符串...),测试此控制器名称,如果检测到,运行您的逻辑以获取实际的控制器名称并将其传递给 @ 987654324@.

【讨论】:

    【解决方案2】:

    我编写了这些代码。我希望它可以帮助你。我使用隐藏字段来了解将运行哪种方法。

    这些是我的模型:

    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>
    

    你可以从here下载我的示例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 2016-12-23
      相关资源
      最近更新 更多