为啥我的方法“DropDownListFor”没有重载?

Posted

技术标签:

【中文标题】为啥我的方法“DropDownListFor”没有重载?【英文标题】:Why am I getting a no overload for method "DropDownListFor'?为什么我的方法“DropDownListFor”没有重载? 【发布时间】:2014-10-13 02:26:06 【问题描述】:

我正在学习 MVC 并编写自己的简单应用程序。一个计算器应用程序。基本上,我想让用户输入两个数字,然后使用下拉菜单来决定他们将对数字进行什么操作。与我之前一直在做的事情不同。下面的代码(除了我在博客文章中找到的下拉提示)完全是我自己的。

问题

我对下拉菜单的重要性感到惊讶。所以我发现这个不错post。我将此代码修改为我的解决方案,我收到以下错误:

描述:在编译服务此请求所需的资源期间发生错误。请查看以下特定错误详细信息并适当修改您的源代码。

Compiler Error Message: CS1501: No overload for method 'DropDownListFor' takes 1 arguments

Source Error:


Line 18:         <p>First Number : @html.TextBoxFor(x => x.Number1) </p>
Line 19:         <p>Second Number: @Html.TextBoxFor(x => x.Number2)</p>
Line 20:         <p>Select Operand: @Html.DropDownListFor(x=>x.OperationItems)</p>
Line 21:         <input type="submit" value="Enter" />
Line 22:     

代码

型号

public class CalculatorData

    private readonly List<CalculatorOperations> ops = new List<CalculatorOperations>();

    //Does this have to be public or not? 
    public string Number1  get; set; 
    public string Number2  get; set; 

    public IEnumerable<SelectListItem> OperationItems
    
        get  return new SelectList(ops); 
    
    //Database context connector? 

    public CalculatorData()
    
        ops.Add(new CalculatorOperations  Name = "Add" );
        ops.Add(new CalculatorOperations  Name = "Subtract" );
        ops.Add(new CalculatorOperations  Name = "Multiply" );
        ops.Add(new CalculatorOperations  Name = "Divide" );
    



  public class CalculatorOperations
  
        public string Name  get; set; 

  

控制器

public class CalculatorController : Controller

    //
    // GET: /Calculator/
    public ActionResult Index()
    
        CalculatorData cd = new CalculatorData();

        return View(cd);
    

查看

@model MVCalculatorDemo.Models.CalculatorData

@
    Layout = null; 


<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>RsvpForm</title>
</head>
<h2>Calculator</h2>
<body>
    @using (Html.BeginForm())
    
        <p>First Number : @Html.TextBoxFor(x => x.Number1) </p>
        <p>Second Number: @Html.TextBoxFor(x => x.Number2)</p>
        <p>Select Operand: @Html.DropDownListFor(x=>x.OperationItems)</p>
        <input type="submit" value="Enter" />
    
</body>
</html>

尝试

    我认为重载方法是大线索。因此,我怀疑我的方法 OperationItems 在我的模型中搞砸了。话虽如此,我不确定它会是什么? This。除了我认为我的模型不适合这个问题。

请原谅任何愚蠢的错误。我想我很接近? Webdev 现在让我头晕目眩。

【问题讨论】:

检查this 为模型添加属性public string Operator get; set;并使用@Html.DropDownListFor(x=&gt;x.Operator, Model.OperationItems) @StephenMuecke 正是这个,然后我重新阅读了 DropDownList() 文档。所以我现在有一个 id 供我选择。有一个新问题。我看到四个名为“MVCalculatorDemo.Models.CalculatorOperations”的对象,而不是 Add、Substract 等。这是因为我在模型中编写 SelectList 的方式吗?我将它重写为 SelectList(ops, "Name"),但同样的错误。我会继续阅读 MSDN 文档。 没关系,我想通了。该模型需要一个 ID 和一个操作名称,以便可以显示 OperationItem。下拉列表需要做很多工作。 :) 什么是CalculatorOperations?如果它似乎只有一个属性Text,你为什么需要它。您的代码可以减少到一两行。 【参考方案1】:

你真的看过你的代码吗? Razor 必须将 DropDownListFor 的声明突出显示为编译错误,因为至少此扩展方法接受两个参数,表达式(与您的模型关联的属性)和将用于填充下拉列表的 IEnumerable&lt;&gt; 对象项目。这应该可以...

@Html.DropDownListFor(x=>x.OperationItems, Model.OperationItems)

有关更多信息,请查看DropDownListFor 的文档

【讨论】:

是的,我一直在查看我的代码。我是新手,经过数小时的阅读和编码,我的大脑快要爆炸了。这对我帮助很大,即使我立即遇到了另一个问题。这帮助我解决了整个问题。现在进入下一部分,即使用我的计算结果制作自定义视图。 :)【参考方案2】:

嗯,这真的很简单。错误告诉你问题所在:

No overload for method 'DropDownListFor' takes 1 arguments
                                         ^^^^^^^^^^^^^^^^

这里是 DropDownListFor:

http://msdn.microsoft.com/en-us/library/system.web.mvc.html.selectextensions.dropdownlistfor(v=vs.118).aspx

如您所见,这些都没有一个参数。最简单的版本需要 3 个参数(虽然第一个是隐藏的,因为它被用作扩展方法的一部分,所以您在实际代码中只能看到 2 个参数)。

一个下拉列表至少需要两个东西,一个保存所选值的变量,以及一个要选择的项目列表。在您的代码中,您没有保存所选项目的变量,那么您如何知道用户选择了哪个项目?

您会在链接到的问题中注意到,答案是有两个参数。

【讨论】:

埃里克,谢谢。我以为我检查了这个,但对 SelectListItem 感到困惑。这就是为什么我只使用一个论点。

以上是关于为啥我的方法“DropDownListFor”没有重载?的主要内容,如果未能解决你的问题,请参考以下文章

为什么DropDownListFor的默认值无法正常工作?

Razor Html.DropDownListFor 自动设置选中值

如何使用对象 MVC 5 C# 的 Javascript 列表填充剃刀 DropDownListFor

填充 DropDownListFor:HtmlHelper 不包含“DropDownListFor”的定义

C# MVC DropDownListFor 字符串列表

Html.DropdownListFor 未设置所选值