0

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

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

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

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

4

3 回答 3

1

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

public ActionResult IndexEvent(string location = "", int? locationID = null)
于 2012-08-07T19:47:36.173 回答
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
}

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

于 2012-08-07T19:49:33.020 回答
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 actions 方法仍然是更可取的(例如,如果我们能够将位置名称解析为 int 会发生什么?)

于 2012-08-07T20:00:58.790 回答