如何将ViewBag项放入文本框?

时间:2013-12-27 21:01:26

标签: c#

我有以下代码,我收到错误说:

 has no applicable method named 'TextBoxFor' but appears to have an extension method by that name. 

我的代码:

 @Html.TextBoxFor(ViewBag.taglist)

4 个答案:

答案 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,因为它会选择一个合适的输入元素来渲染数据。 (在这种情况下,由于Descriptionstring,因此会呈现文本框。)

答案 2 :(得分:0)

如果未在视图中明确设置模型类型,则无法使用Html.TextBoxFor。如果您未指定类型,则默认为dynamic。如果要进行模型绑定,则必须使用显式类型而不是动态类型,如ViewBag。要使用Html.TextBoxFor,您必须定义一个模型类型,用于定义要绑定的属性。否则,您必须使用Html.TextBox并从ViewBag手动设置值。正如其他人所说,如果你使用静态类型模型并利用内置的MVC模型绑定,你将使你的生活更轻松。

答案 3 :(得分:-1)

您必须使用lambda表达式来选择属性,并且必须将ViewBag成员强制转换为正确的类型。

@Html.TextBoxFor(model => (string)ViewBag.taglist)