所以,我建议移动到使用viewmodels而不是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到您的模型和地图的ViewModels但你肯定能做到这一点手动尽管整个左手/右手的事情变得非常乏味。
如果你这样做,事情会变得更容易,而且根本没有太多的工作。
更新
但是,如果你真的想传递价值,鉴于ViewBag,你可以这样做:
在你的控制器动作:
ViewBag.CompName = "Some Name";
然后在您的视图中:
@Html.TextBoxFor(model =>model.Comps.CompName, new {@Value = ViewBag.CompName})
而且这将预填充文本框中的“某些名称”。
我仍然用viewmodel的方法,但这似乎工作得很好。希望有所帮助!
感谢您的回复itsmatt。这个视图包是在我参加比赛的比赛中进行的,并采用了我的'比赛'模型的名字(还有一个CompetitionEntry模型(这样我就可以在参赛表格顶部显示比赛的名字)模型我有一个导航属性“公共虚拟竞赛比赛”,我认为将有一个简单的方法来预先填充CompetitionEntry.CompName TextBox和viewbag中的内容我不想在这个阶段改变我的模型说实话,你知道在视图中做这个的方法吗?再次感谢。 – Dan
Dan,在我的答案结尾处看到我的更新。似乎在我的测试项目中工作得很好。 – itsmatt
我不会去试试这个一个小时左右,我会写回来,当我这样做。谢谢你所有的帮助亚光! – Dan