我可以传递另一个要在 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 =>..."不起作用)

我可以传递另一个要在 Html.BeginForm 中使用的模型对象吗?

所以这发生在你的控制器中。您需要有一个视图模型,它是要传递给视图的所有对象的容器。然后,在视图中,利用@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,我希望它在我的登记册上,以便我可以确认原始密码是他们想要的。但它在我的验证层停止,过去,它被完全丢弃 - 当我们确认密码匹配时,我只需要他们输入的原始密码。