2011-09-07 74 views
5

我是新手,非常抱歉,如果这不够解释。我想在asp.net mvc 3中预填一个表单中的字段。在asp.net mvc中预填充Html.TextBoxFor 3

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

但是,当我想预先填充一个值并将该值发送到我的模型,就像这样;

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

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

在此先感谢!

回答

15

所以,我建议移动到使用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的方法,但这似乎工作得很好。希望有所帮助!

+0

感谢您的回复itsmatt。这个视图包是在我参加比赛的比赛中进行的,并采用了我的'比赛'模型的名字(还有一个CompetitionEntry模型(这样我就可以在参赛表格顶部显示比赛的名字)模型我有一个导航属性“公共虚拟竞赛比赛”,我认为将有一个简单的方法来预先填充CompetitionEntry.CompName TextBox和viewbag中的内容我不想在这个阶段改变我的模型说实话,你知道在视图中做这个的方法吗?再次感谢。 – Dan

+0

Dan,在我的答案结尾处看到我的更新。似乎在我的测试项目中工作得很好。 – itsmatt

+0

我不会去试试这个一个小时左右,我会写回来,当我这样做。谢谢你所有的帮助亚光! – Dan

3

从您的控制器中,如果您使用接受模型对象的View(...)方法重载之一传递使用默认值初始化的模型,那么这些值将在渲染时由视图使用。您不需要使用@value = ...语法。