我有以下代码,我收到错误说:
has no applicable method named 'TextBoxFor' but appears to have an extension method by that name.
我的代码:
@Html.TextBoxFor(ViewBag.taglist)
答案 0 :(得分:4)
为什么不在视图中使用强类型模型而不是ViewBag
。这将使您的生活更轻松。
事实上,您必须使用TextBoxFor
模型,否则它将无效。参见TextBoxFor的定义 - 作为第二个参数,它采用一个lambda表达式,它将一个属性形成一个模型。
如果您只想要一个文本框,有两个选项:
@Html.TextBox("NameOfTheTextbox", (String)ViewBag.SomeValue)
或者只是去
<input type="text" value="@ViewBag.SomeValue" />
无需复杂的解决方案。
答案 1 :(得分:2)
我同意使用强类型模型的其他建议,因为编译时错误支持比调试异常要好得多。话虽如此,为了做你想做的事,你可以使用:
@Html.TextBox("NameOfTextBox", (string)ViewBag.taglist)
既然你已经在评论中提供了一些细节,我就会猜测你可能会做些什么,以便提供一个简单的例子。
我假设您有一个标签列表(如每个问题的SO),您希望在文本框中整齐地显示,每个标签用空格分隔。我将假设您的Tag
域模型看起来像这样:
public class Tag
{
public int Id { get; set; }
public string Description { get; set; }
}
现在,您的视图需要一个标记列表,但也可能需要显示其他一些信息。但是,我们只关注标签。下面是一个代表所有标签的视图模型,考虑到您希望将它们显示为文本框中的字符串:
public class SomeViewModel
{
public string Tags { get; set; }
// Other properties
}
为了获得您想要的数据,您可以抓住所有这些标签:
public ActionResult Index()
{
using (YourContext db = new YourContext())
{
var model = new SomeViewModel();
model.Tags = string.Join(" ", db.Tags.Select(t => t.Description).ToList());
return View(model);
}
}
注意我是如何直接将model
传递给视图的。
视图现在非常简单:
@model SomeViewModel
@Html.EditorFor(m => m.Tags)
model
指令表示视图是强类型的。这意味着此视图将收到SomeViewModel
的实例。从上面的操作代码中可以看出,我们将为此视图提供所需的类型。现在,我们可以使用强类型HtmlHelper
(即Html.XxxFor
)方法。
在这种特殊情况下,我使用了Html.EditorFor
,因为它会选择一个合适的输入元素来渲染数据。 (在这种情况下,由于Description
是string
,因此会呈现文本框。)
答案 2 :(得分:0)
如果未在视图中明确设置模型类型,则无法使用Html.TextBoxFor
。如果您未指定类型,则默认为dynamic
。如果要进行模型绑定,则必须使用显式类型而不是动态类型,如ViewBag
。要使用Html.TextBoxFor
,您必须定义一个模型类型,用于定义要绑定的属性。否则,您必须使用Html.TextBox
并从ViewBag
手动设置值。正如其他人所说,如果你使用静态类型模型并利用内置的MVC模型绑定,你将使你的生活更轻松。
答案 3 :(得分:-1)
您必须使用lambda表达式来选择属性,并且必须将ViewBag成员强制转换为正确的类型。
@Html.TextBoxFor(model => (string)ViewBag.taglist)