ASP MVC路由:同一动作/视图的{3个路由

时间:2017-12-15 10:28:27

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

我有这个控制器只有1个动作并使用id(int):

public class PropertiesController: Controller
{
    public ActionResult Index (int idEstate = 0, int idCity = 0, int [] idNeighborhoods = null)
    {
        string IdEstate ;
        string IdCity ;
        int [] IdNeighborhoods ;

        #ReadOrSetCookie

        #SetViewBags

        #ReturnNeighborhoods

        #ReturnProperties

        return View();
    }
}

在视图中我有一个表单,用户可以选择1个州和1个城市以及一组社区。并且当提交返回到操作索引时,不会读取此数据,而是从表单接收cookie,然后搜索并返回属性。工作正常。我这里没有问题。

我的问题是每次返回显示用户的以下网址:

  

的MySite /属性/索引

我需要返回,具体取决于用户在表单中选择的内容如果他刚刚报告了状态:

  

的MySite /属性/ {StateInformed}

如果他也选择了一个城市:

  

的MySite /属性/ {StateInformed} / {CityInformed}

     

e.g。 www.mysite.com/properties/Florida/Miami

我的routConfig是默认值:

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Properties", action = "Index", id = UrlParameter.Optional }
        );

我的简化形式是(我不会报告动词或其他任何不同的内容)

@using (Html.BeginForm("Index", "Home"))
{
   @Html.DropDownList("idEstado", new SelectList(ViewBag.ListaEstados, "idEstado", "txtNomeEstado", ViewBag.idEstadoCookie))
   @Html.DropDownList("idCidade", new SelectList(ViewBag.ListaCidades, "idCidade", "txtNomeCidade", ViewBag.idCidadeCookie))
   <input type="submit" value="BUSCAR" />
}

可以只使用1个动作并使用id(int)来执行此操作吗?有人可以帮我这么做吗?

在此更新----------------------------------------- < /强>

使用这里建议我尝试这个......

我在控制器中添加了这个装饰:

    [Route("")]
    [Route("imoveis/{idEstado?}")]
    [Route("imoveis/{idEstado?}/{idCidade?}")]
    [Route("imoveis/{idEstado?}/{idCidade?}/{idRegiao?}")]
    public ActionResult Index (int idEstate = 0, int idCity = 0, int [] idNeighborhoods = null)

我将视图中的表单更改为使用get并拥有Id:

@using (Html.BeginForm("Index", "imoveis", FormMethod.Get, new { id = "buscaimovel" }))

我为每个selct列表添加了html atribut表单。但是在选择状态我把表格=&#34; buscaimovel&#34;对于其他人,我提出了一个不同的形式,如:

@Html.DropDownList("idEstado", new SelectList(ViewBag.ListaEstados, "idEstado", "txtNomeEstado", ViewBag.idEstadoCookie), new { @form = "buscaimovel" })
@Html.DropDownList("idCidade", new SelectList(ViewBag.ListaCidades, "idCidade", "txtNomeCidade", ViewBag.idCidadeCookie), new { @form = "nulo" })

最后,当选择一个项目时,我使用jquery来更改表单属性

$(document).ready(function () {
        $("#idRegiao")
            .change(function () {
                if ($("#idRegiao").val() != null) $("#idRegiao").attr("form", "buscaimovel");
            });
    });

尼斯!现在我有不同的网址回复了:

  

//本地主机:57094 / idEstado = 11

     

//本地主机:57094 / idEstado = 11&安培; idCidade = 41

     

//本地主机:57094 / idEstado = 11&安培; idCidade = 41&安培; idRegiao = 258

或者这个:

  

//本地主机:57094 / imoveis / 11

     

//本地主机:57094 / imoveis /四十一分之一十一

     

//本地主机:57094 / imoveis / 11 /258分之41

但请参阅返回ID。我可以通过ids [int]保留我的行动来返回房地产,城市和地区的名称吗?

2 个答案:

答案 0 :(得分:0)

您可以使用属性路由

在路线配置中:

routes.MapMvcAttributeRoutes();

不,你可以使用路线属性来装饰你的动作 的控制器:

        [Route("~/Prop/{StateInformed?}")]
        public ActionResult Test(string StateInformed = null)
        {
            // DO STAFF

            return View();
        }

        [HttpPost]
        [Route("~/Prop/{StateInformed?}")]
        public ActionResult Test(int? idState)
        {
            // DO STAFF

            String state = string.Empty;

            if (idState.HasValue)
            {
            state = "MyState";
            }

            // if state is null the route will be "/Prop" else "/Prop/MyState"
            return RedirectToAction("Test", new { StateInformed =state});
        }

查看:

@using (Html.BeginForm())
{
   @Html.TextBox("idState")
   <input type="submit" value="BUSCAR" />
}

示例here

玩它吧

答案 1 :(得分:0)

您可以将非必需属性设置为可选属性,或者如果您不希望这些属性可选,则为每个属性组合创建单独的方法。