如何在不创建新视图的情况下使用不同类型的参数?

时间:2012-08-07 19:42:09

标签: asp.net-mvc-3 razor

我想创建一个包含字符串和int值的列表,如下所示:

@Html.ActionLink("Back to List", "IndexEvent", new { location = "location" })

@Html.ActionLink("Back to List", "IndexEvent", new { locationID = 1 })

它不起作用。我猜MVC控制器没有得到参数的类型差异。所以,我不得不将一个新的Action作为“IndexEvenyByID”,但它需要有一个新的视图。由于我想保持简单,有没有办法对不同的参数使用相同的视图?

3 个答案:

答案 0 :(得分:1)

尝试向IndexEvent操作添加两个可选参数,如下所示:

public ActionResult IndexEvent(string location = "", int? locationID = null)

答案 1 :(得分:1)

这不应该需要新的视图或视图模型。你应该有两个你所描述的动作,但代码可以如下:

<强>控制器

public ActionResult GetEvents(string location){
    var model = service.GetEventsByLocation(location);
    return View("Events", model);
}

public ActionResult GetEventsById(int id){
    var model = service.GetEventsById(id);
    return View("Events", model);
}

<强>服务

public MyViewModel GetEventsByLocation(string location){
    //do stuff to populate a view model of type MyViewModel using a string
}

public MyViewModel GetEventsById(int id){
   //do stuff to populate a view model of type MyViewModel using an id
}

基本上,如果您的View将使用相同的视图模型,并且唯一改变的是如何获取该数据,则可以完全重用View。

答案 2 :(得分:0)

如果你真的想要坚持单一动作和多种类型,你可以使用一个对象参数。

public ActionResult GetEvents(object location)
{
    int locationID;
    if(int.TryParse(location, out locationID))
        var model = service.GetEventsByID(locationID);
    else
        var model = service.GetEventsByLocation(location as string);
    return View("Events", model);
}

类似的东西(不完全正确,但它给你一个想法)。然而,这并不是一个“干净”的方式去做IMO。

(编辑)

但是2动作方法仍然是可取的(例如,如果我们能够将位置名称解析为int会发生什么?)