我有两个连接的模型。为简化起见,我说我有帖子和评论。当详细信息页面发布时,我想构建一个发表评论的表单。
我可以通过简单的 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 =>
..."无效)
答案 0 :(得分:3)
所以这发生在您的控制器中。您需要有一个视图模型,它是要传递给视图的所有对象的容器。在您的视图中,您可以利用@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()
那些&#34;低级&#34;助手。如果我想要绝对控制,那么我只是自己编写HTML! id
属性应与您的对象级别相关:
<input id="Post.Name" type="text" />
它的MVC架构是正确的,所以你有定义DB域的模型。您有可以显示模型信息的视图。你有控制器,应该委托从数据库获取模型并将它们发送到页面。要将多个模型添加到页面,我们需要使用ViewModel。
语义很重要,并且在许多系统中广泛使用。 Web和桌面,所以理解它们非常重要。
在我的产品中,我使用的是N层架构方法。我有服务,DAL,控制器,ViewModel,模型,DTO。
DTO是我将模型映射到的,它代表域传输对象。所以我得到了我的域模型,我可能不想要它上面的所有内容(例如我没有使用导航属性,因此我的DTO具有这些导航属性),为了减少它我创建了一个DTO,这就是周围使用的我的系统传输那些数据。当我想保存该数据时,我将其映射回域模型并持久保存到数据库。
一个关键的例子是你使用ASP.NET身份的东西。所以ASP.NET走了使认证EF Code First友好的路线。如果你看一下这个用户模型,它有一些我不需要使用的属性和导航。特别是如果您只想注册用户。
我的注册DTO将有一个我的用户没有的字段。 ConfirmPassword
,我希望它在我的注册表中,以便我可以确认原始密码是他们的意思。但它停在我的验证层,过去,它完全被删除 - 当我们确认密码匹配时我只需要输入他们的原始密码。