允许将其他参数传递给URL

时间:2011-12-05 18:29:34

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

首先,我对我完全缺乏对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的车辆的能力,因为它们当前有,但是有一个可选的显示类型......

有人能指出我正确的方向吗?

3 个答案:

答案 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"