我可以传递另一个要在 Html.BeginForm 中使用的模型对象吗?
本文关键字:模型 对象 BeginForm 另一个 Html 我可以 | 更新日期: 2023-09-27 18:31:16
我有两个连接的模型。为了简化起见,假设我有一个帖子和评论。当详细信息页面发布时,我想构建一个用于发布评论的表单。
我可以用纯 html 轻松做到这一点。但我希望使用Html.BeginForm
.
首先,我将一个新的 Comment 对象从控制器传递到详细信息页面。
@{
ViewBag.Title = "Details";
Comment newComment = ViewBag.Comment;
}
@using (Html.BeginForm("Create", "Comments", FormMethod.Post))
{
@Html.EditorFor(newCooment => newComment.Comment, new { htmlAttributes = new { @class = "form-control" }
})
但是,如何告诉HtmlHelper
使用我的注释模型呢?("newComment =>
..."不起作用)
所以这发生在你的控制器中。您需要有一个视图模型,它是要传递给视图的所有对象的容器。然后,在视图中,利用@Model
属性访问此 VM。
public class MyController : Controller
{
public ActionResult Index
{
var myViewModel = new MyViewModel
{
Post = post,
Comment = comment // assumed that these have been read from a DB
};
return View(myViewModel);
}
}
视图模型:
public class MyViewModel
{
public Post Post {get;set;}
public Comment Comment {get;set;}
}
在您看来:
@model some.namespace.to.viewmodel.MyViewModel
@using(Html.BeginForm())
{
}
@Model <-- this is your MyViewModel instance you created in the controller
@Model.Comment <-- this has your Comment in
@Model.Post <-- this has your Post in
在控制器中,我们执行此操作 return View(myViewModel)
.这是告诉 Razor 引擎,我们希望将@Model
设置为我们的ViewModel
并在我们的页面中使用它。
我倾向于避开创建一大堆 html 的帮助程序函数。我喜欢完全控制我的 HTML,所以我使用那些"低级"帮助程序@Html.TextBoxFor()
或@Html.TextAreaFor()
。如果我想要绝对控制,那么我就自己编写 HTML!id
属性应与对象级别相关:
<input id="Post.Name" type="text" />
这是MVC的架构,所以你有定义数据库域的模型。您有显示模型信息的视图。您有控制器,这些控制器应委派从数据库获取模型并将其发送到页面。要将多个模型带到页面,我们需要使用 ViewModel。
语义很重要,并且在许多系统中广泛使用。Web和桌面,因此理解它们非常重要。
在我的产品中,我使用 N 层体系结构方法。我有服务,DAL,控制器,视图模型,模型,DTO。
DTO 是我将模型映射到的内容,它代表域传输对象。所以我得到了我的域模型,我可能不想要它上面的所有内容(例如,我不使用导航属性,所以我的 DTO 具有这些导航属性),为了减少它,我创建了一个 DTO,它是在我的系统周围用于传输该数据的。当我想保存该数据时,我会将其映射回域模型并保存到数据库。
一个关键的例子是,如果你使用的是 ASP.NET 标识的东西。因此,ASP.NET 走上了使身份验证 EF Code First 友好的路线。如果您查看用户模型,它会发现它有大量我不需要使用的属性和导航。特别是如果您只想注册用户。
我的注册 DTO 将有一个我的用户没有的字段。 ConfirmPassword
,我希望它在我的登记册上,以便我可以确认原始密码是他们想要的。但它在我的验证层停止,过去,它被完全丢弃 - 当我们确认密码匹配时,我只需要他们输入的原始密码。