我想在我的Base控制器中创建一个方法,该方法将获取一个列表并将其作为SelectList返回。我写了一个方法,网站编译,但我得到这个消息:
无法在控制器'PublicationSystem.Controllers.BaseController上调用操作方法'System.Collections.Generic.IEnumerable
1[System.Web.Mvc.SelectListItem] GetSelectList[T](System.Collections.Generic.IEnumerable
1 [T],System.String,System.String,System.String,System.Object)' '因为行动方法是一种通用的方法 参数名称:methodInfo
我想知道我做错了什么。这是代码:
public partial class BaseController : Controller
{
public IEnumerable<SelectListItem> GetSelectList<T>
(
IEnumerable<T> itemList,
string textField,
string valueField,
string defaultPrompt = "",
object defaultValue = null)
{
IEnumerable<SelectListItem> returnList = null;
if (!string.IsNullOrEmpty(defaultPrompt))
{
returnList = Enumerable.Repeat(
new SelectListItem { Value = (string)defaultValue, Text = defaultPrompt },
count: 1);
}
var textProp = typeof (T).GetProperty(textField);
var valueProp = typeof (T).GetProperty(valueField);
returnList = returnList.Concat
(itemList
.Select(x =>
new SelectListItem
{
Value = Convert.ToString(valueProp.GetValue(x)),
Text = Convert.ToString(textProp.GetValue(x)),
}).Distinct().ToList());
return returnList.ToList();
}
}
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.LowercaseUrls = true;
routes.MapMvcAttributeRoutes(); // Errors here
//..
}
}
答案 0 :(得分:14)
答案 1 :(得分:0)
我删除了这个方法。我把它变成IEnumerable<T>
的扩展方法。这就是我现在正在做的事情:
public static class EnumerableExtensions
{
public static IEnumerable<SelectListItem> AsSelectList<T>
(
this IEnumerable<T> dataList,
string textField,
string valueField,
string defaultPrompt = "",
object defaultValue = null)
{
IEnumerable<SelectListItem> returnList = new List<SelectListItem>();
if (!string.IsNullOrEmpty(defaultPrompt))
{
returnList = Enumerable.Repeat(
new SelectListItem { Value = (string)defaultValue, Text = defaultPrompt },
count: 1);
}
var textProp = typeof(T).GetProperty(textField);
var valueProp = typeof(T).GetProperty(valueField);
returnList = returnList.Concat
(dataList
.Select(x =>
new SelectListItem
{
Value = Convert.ToString(valueProp.GetValue(x)),//x["valueField"],
Text = Convert.ToString(textProp.GetValue(x)),//x.["textField"]
}).Distinct().ToList());
return returnList;
}
}