MVC应用程序不使用通用方法运行

时间:2016-03-04 15:40:32

标签: c# asp.net-mvc generics

我想在我的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
        //..
    }
}

2 个答案:

答案 0 :(得分:14)

您的方法在控制器类中为public。 Asp.Net将此方法视为一种操作方法。

您无法使用通用方法进行操作。检查this

如果要在派生类(控制器)上使用此方法。制作方法protected

答案 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;
    }
}