2011-12-05 31 views
0

首先,我很抱歉我完全不了解MVC - 我已经在WPF和Silverlight上工作了四年,并且刚刚继承了MVC应用程序!允许将其他参数传递给URL

使用该系统目前可以你可以使用目前在以下网址访问车辆:

http://localhost:61276/Vehicle/12407 

末的数字是车辆ID,并通过这段代码在控制器运行...

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

但我发现了以下错误:

The current request for action 'VehicleView' on controller type 'SearchController' is ambiguous"

我需要保持引用的能力目前没有显示器类型的车辆,但具有可选的显示器类型...

任何人都可以指向正确的方向吗?

回答

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参数。

0

您应该制作一个采用两个参数的单次过载,并使第二个参数可选,其默认值为"features"

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