可能触发操作取决于MVC控制器的给定参数?

时间:2014-01-08 02:13:38

标签: c# asp.net-mvc asp.net-mvc-4

假设我有一个名为User的控制器,我有一个索引ActionResult,然后是一个名为SetUserInfo的辅助ActionResult。示例如下:

    public ActionResult Index(int id)
    {
        var enviorment = Zen.Components.Environment.GetEnvironmentByID(id);

        return View(settingsViewModal);
    }


    //Second action
     public ActionResult SetSite(int id, int siteID)
    {
        var enviorment =
          Zen.Components.Environment.GetEnvironmentByID(
             new EnviornmentQuery() {EnviormentID = id, SiteID = siteID);

        return View(enviorment.Site);
     }

由于网址"设置?id = 1"触发ActionResult"索引",我可以获得"设置?id = 1& siteID = 133"然后让控制器知道它必须触发ActionResult" SetSite"基于它给出的参数,或者我必须在第一个ActionResult中使它们成为可选项,或者我认为这一切都是错误的。路线映射是我需要一分钟才能完全获得的。我知道它可以被调用如下" Settings / SetSite?id = 1& siteID = 133",但是想知道我是否可以做我之前的例子?如果是这样,处理它是不是一种坏方法?

2 个答案:

答案 0 :(得分:4)

您可以为其映射路线:

routes.MapRoute(
    name: "SetSiteRoute",
    url: "{controller}/{action}/{id}/{siteID}",
    defaults: new { controller = "Settings", action = "SetSite" }
    //                                  Important part ^^^^^^^
);

确保将其置于默认路线之上,以使其优先(路线按顺序处理)。

这将允许:www.site.com/Settings/1/500其中1是id,500是siteID

答案 1 :(得分:1)

虽然不是你可能正在寻找的答案..

首先,您不能以这种方式映射您的路线。路线不能包含?虽然你可以使用另一种方法来使用类似

之类的东西来调用你的路线
/Settings/{id}/{siteId} 

使用以下

/Settings?id={id}&siteID={siteId}

不能映射为路线。但是,您可以轻松地将网站ID属性添加到索引操作,例如。

public ActionResult Index(int id, int? siteID)
{
    if (siteID.HasValue)
        return SetSite(id, siteID);
    return null;
}


//Second action
public ActionResult SetSite(int id, int siteID)
{
    return null;
}

我知道这不是你正在寻找的东西,但是你可以获得相同的结果而不必乱用你的路线和网址。 (注意我只是返回null以便编译)。

干杯。