首先,我对我完全缺乏对MVC的理解表示歉意 - 我已经使用WPF和Silverlight四年了,并且刚刚继承了一个MVC应用程序!
使用该系统,您当前可以使用以下URL访问车辆:
http://localhost:61276/Vehicle/12407
最后的数字是车辆ID,并在Controller ...中运行这段代码。
public virtual ActionResult VehicleView(int id)
{
var vehicle = VehicleService.Get(id);
return View("VehicleView", new VehicleViewModel { VehicleDetail = vehicle != null ? vehicle.Details : null, Vehicle = vehicle, DetailDisplayType = "features"});
}
最后一个参数是DetailDisplayType ...
我需要能够更改DetailDisplayType
我天真地以为我可以通过添加这样的另一种方法来做到这一点......
public virtual ActionResult VehicleView(int id, string detailDisplayType)
{
var vehicle = VehicleService.Get(id);
return View("VehicleView", new VehicleViewModel { VehicleDetail = vehicle != null ? vehicle.Details : null, Vehicle = vehicle, DetailDisplayType = detailDisplayType });
}
但我收到以下错误:
控制器类型'SearchController'上的当前操作请求'VehicleView'是不明确的“
我需要保持引用没有DisplayType的车辆的能力,因为它们当前有,但是有一个可选的显示类型......
有人能指出我正确的方向吗?
答案 0 :(得分:2)
将detailDisplayType
参数设为可为空并将其路由设置为Optional
routes.MapRoute("VehicleView", "vehicles/{id}/{detailDisplayType}",
new {
area = "",
controller = "vehicles",
action = "vehicleview",
detailDisplayType = UrlParameter.Optional
}
);
public virtual ActionResult VehicleView(int id, DetailDisplayType? detailDisplayType)
{
var vehicle = VehicleService.Get(id);
var model = new VehicleViewModel
{
VehicleDetail = vehicle == null ? null : vehicle.Details,
Vehicle = vehicle,
DetailDisplayType = detailDisplayType ?? DetailDisplayType.Features
}
return View("VehicleView", model);
}
答案 1 :(得分:1)
您可以通过在代码中仅实施一个VehicleView操作来解决歧义。您的代码应如下所示:
public virtual ActionResult VehicleView(int id, string detailDisplayType)
{
var vehicle = VehicleService.Get(id);
return View("VehicleView", new VehicleViewModel { VehicleDetail = vehicle != null ? vehicle.Details : null, Vehicle = vehicle, DetailDisplayType = detailDisplayType??"features" });
}
有趣的东西是动作体第二行的“特征”。如果未在URL中的某处给出(很可能是查询参数),ASP.NET MVC会将您的null提供给detailDisplayType参数。
答案 2 :(得分:0)
您应该进行一次带有两个参数的重载,并使第二个参数可选,默认值为"features"
。