在asp.net mvc 3中预填充Html.TextBoxFor

Dan*_*Dan 6 razor asp.net-mvc-3

我是新来的,如果这还不够解释,请道歉.我想在asp.net mvc 3中预填充表单中的字段.

@Html.TextBox("CompName", null, new { @value = ViewBag.CompName })
Run Code Online (Sandbox Code Playgroud)

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

 @Html.TextBoxFor(model => model.Comps.CompName, null, new { @value = ViewBag.CompName })
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!

its*_*att 15

所以,我建议转向使用viewmodels而不是ViewBag.我在我的项目中创建了一个名为ViewModels的文件夹,然后在那里根据需要制作一些子文件夹,我放置了各种视图模型.

如果您创建一个viewmodel类,如下所示:

public class MyViewModel
{
   public string CompName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

@model MyNamespace.ViewModels.MyViewModel

@Html.EditorFor(model => model.CompName)
Run Code Online (Sandbox Code Playgroud)

或者@Html.TextBoxFor也会工作.

然后回到你的控制器动作的帖子,你有这样的事情:

[HttpPost]
public ActionResult MyAction(MyViewModel viewModel)
{
   ...
   // do whatever you want with viewModel.CompName here, like persist it back
   // to the DB
   ...
}
Run Code Online (Sandbox Code Playgroud)

可能是你使用像automapper这样的东西来映射模型和视图模型,但你也可以手动完成,尽管整个左手/右手的东西变得相当繁琐.

如果你这样做会让事情变得更容易,而且根本没有多少工作.


更新

但是,如果你真的想在ViewBag中传递该值,你可以这样做:

在您的控制器操作中:

ViewBag.CompName = "Some Name";
Run Code Online (Sandbox Code Playgroud)

然后在你看来:

@Html.TextBoxFor(model =>model.Comps.CompName, new {@Value = ViewBag.CompName})
Run Code Online (Sandbox Code Playgroud)

并且这将使用"Some Name"预先填充文本框.

我仍然采用viewmodel方法,但这似乎运作良好.希望有所帮助!