我有这个控制器只有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]保留我的行动来返回房地产,城市和地区的名称吗?
答案 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)
您可以将非必需属性设置为可选属性,或者如果您不希望这些属性可选,则为每个属性组合创建单独的方法。