我想创建一个包含字符串和int值的列表,如下所示:
@Html.ActionLink("Back to List", "IndexEvent", new { location = "location" })
和
@Html.ActionLink("Back to List", "IndexEvent", new { locationID = 1 })
它不起作用。我猜MVC控制器没有得到参数的类型差异。所以,我不得不将一个新的Action作为“IndexEvenyByID”,但它需要有一个新的视图。由于我想保持简单,有没有办法对不同的参数使用相同的视图?
答案 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会发生什么?)