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

M K*_* II 6 c# generics asp.net-mvc

我想在我的Base控制器中创建一个方法,该方法将获取一个列表并将其作为SelectList返回.我写了一个方法,网站编译,但我得到这个消息:

无法1[System.Web.Mvc.SelectListItem] GetSelectList[T](System.Collections.Generic.IEnumerable在控制器'PublicationSystem.Controllers.BaseController'上调用操作方法'System.Collections.Generic.IEnumerable 1 [T],System.String,System.String,System.String,System.Object)'因为action方法是通用的方法.
参数名称: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
        //..
    }
}
Run Code Online (Sandbox Code Playgroud)

Erk*_*rel 17

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

您不能使用通用方法进行操作.检查一下.

如果要在派生类(控制器)上使用此方法.制定你的方法protected.

  • “Asp.Net 会将此方法视为操作方法。” 是重点,谢谢。这为继承控制器的工作方式以及应该和不应该存在的内容提供了新的思路。 (2认同)