在ASP.NET MVC 3中预填Html.TextBoxFor

7

我还不熟悉这个,如果解释不够清楚请见谅。我想在ASP.NET MVC 3中的表单中预填写一个字段。以下代码可以实现:

@Html.TextBox("CompName", null, new { @value = ViewBag.CompName })

但是当我想要预填一个值并将该值发送到我的模型中时,代码如下:

 @Html.TextBoxFor(model => model.Comps.CompName, null, new { @value = ViewBag.CompName })

这不起作用。有任何想法吗?

提前感谢!

2个回答

16

因此,我建议使用视图模型而不是 ViewBag。我在我的项目中创建了一个名为 ViewModels 的文件夹,然后在其中根据需要创建一些子文件夹,其中放置了各种视图模型。

如果您像这样创建一个视图模型类:

public class MyViewModel
{
   public string CompName { get; set; }
}

那么在您的控制器操作中,您可以创建其中一个并填充它,可能来自从数据库中提取的某些现有模型。通过在视图模型中设置CompName属性,它将在视图中具有该值。然后您的视图可能看起来像这样:

@model MyNamespace.ViewModels.MyViewModel

@Html.EditorFor(model => model.CompName)

或者@Html.TextBoxFor也可以使用。

然后在您的控制器动作中进行提交时,您会得到类似于以下代码:

[HttpPost]
public ActionResult MyAction(MyViewModel viewModel)
{
   ...
   // do whatever you want with viewModel.CompName here, like persist it back
   // to the DB
   ...
}
可能你正在使用像automapper这样的工具来映射你的模型和视图模型,但你也可以手动完成,虽然左右两边的事情会变得非常乏味。以这种方式做事情会使它更容易,并且几乎不需要太多工作。

更新

但是,如果你真的想在视图中传递那个值到ViewBag,你可以这样做:

在你的控制器操作中:

ViewBag.CompName = "Some Name";

那么在你的视图中:

@Html.TextBoxFor(model =>model.Comps.CompName, new {@Value = ViewBag.CompName})

这将使用 "Some Name" 预填充文本框。

我仍然会采用 ViewModel 方法,但这似乎足够好用。希望能对你有所帮助!


谢谢你的回复,itsmatt。ViewBag位于我的get-enter竞赛操作中,并从我的“竞赛”模型(还有一个CompetitionEntry模型)中获取名称。这样我就可以在输入表单顶部显示比赛名称。在我的竞赛录入模型中,我有一个导航属性“public virtual Competition Competitions”。我认为有一种简单的方式将CompetitionEntry.CompName文本框预填充为视图包中内容。老实说,我不想在这个阶段更改我的模型,你知道在视图中如何做到这一点吗?再次感谢。 - Dan
Dan,请看我答案末尾的更新。在我的测试项目中似乎工作得很好。 - itsmatt
我得等一个小时左右才能试一下,试完后我会再写回来的。感谢你的帮助,马特! - Dan
嗨,Matt,那行得通,但现在当我提交表单时,没有任何内容输入到数据库中。当我检查所有字段时,它们都是空白的。我需要做一些调查... - Dan
所以我通过向CompetitionEntry模型添加CompName属性并将ViewBag值传递给它来修复了它,而不是通过导航属性CompetitionEntries.Comps.CompName。因此,在我的Get操作中,我通过Competition模型中的id获取CompName,并通过viewbag将其传递到CompEntries中的CompNmae。看起来有点老派,但那就是MVC!我认为如果我像你说的那样只是使用一个视图模型,它就会起作用,但我仍然认为这是奇怪的行为。 - Dan
显示剩余2条评论

3

如果你从控制器传递一个使用默认值初始化的模型对象到一个接受模型对象的 View(...) 方法重载中,视图在呈现时将使用这些值。这样,你就不需要使用 @value = ... 语法了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接