如何在razor语法中组合嵌套模型lambda

时间:2019-01-11 11:59:35

标签: c# razor asp.net-mvc-5

我的视图模型

public class PostViewModel
{
    public Post Post { get; set; }

    public IEnumerable<Comment> Comments { get; set; }
}

在我的剃须刀视图中,我试图获取数据以发表评论

@using (Html.BeginForm("Comment", "Post"))
{


    <div class="form-group">
        @Html.LabelFor(m => m.Comments.Data);
        @Html.TextAreaFor(m => m.Comments.Data, new { @class = "form-control" })
    </div>

    @Html.HiddenFor(m => m.Comments.Id)
    <button type="submit" class="btn btn-primary"> Comment </button>
}

但是我遇到了错误

然后我尝试了以下语法

@using (Html.BeginForm("Comment", "Post"))
{

    @foreach(var comment in Model.Comments)
    {
        <div class="form-group">
            @Html.LabelFor(comment.Data);
            @Html.TextAreaFor(comment.Data, new { @class = "form-control" })
        </div>

        @Html.HiddenFor(comment.Id)
        <button type="submit" class="btn btn-primary"> Comment </button>

    }
}

但是我仍然遇到错误

实际上我在做一个博客项目

因此,我希望“详细信息”页面中包含“帖子”,所有旧评论和新评论按钮

2 个答案:

答案 0 :(得分:1)

您的lambda语法错误。以下内容将编译并工作,但不会将值发布回控制器操作:

@foreach(var comment in Model.Comments)
{
    @Html.LabelFor(x=> comment.Data)
}

第二,为了将集合发布回操作,应该在带有索引的索引的for循环中完成,因为模型绑定程序将使用不会以模型绑定程序格式生成的输入控件的名称将其绑定到集合。需求。

喜欢:

@for(int i=0; i < Model.Comments.Count(); i++)
{
    <div class="form-group">
        @Html.LabelFor(x => Model.Comments[i].Data);
        @Html.TextAreaFor(x => Model.Comments[i].Data, new { @class = "form-control" })
    </div>

    @Html.HiddenFor(x => Model.Comments[i].Id)
    <button type="submit" class="btn btn-primary"> Comment </button>

}

答案 1 :(得分:1)

Ehsan Sajjad让我明白,我们可以编写这样的lambda表达式

@Html.LabelFor(x=> comment.Data)

后来我解决了我的问题,实际上我的方法很错误

为解决我的问题,我在ViewModel中添加了另一个组件NewComment

public class PostViewModel
{
    public Post Post { get; set; }

    public IEnumerable<Comment> Comments { get; set; }

    public Comment NewComment { get; set; } // this is new addition
}

然后“我的新评论”区域就像剃刀语法中的以下内容一样

@using (Html.BeginForm("Comment", "Post", Model.Post))
{


    var comment = Model.NewComment;

    <div class="form-group">
        @Html.LabelFor(m => comment.Data);
        @Html.TextAreaFor(m => comment.Data, new { @class = "form-control" })
    </div>

    @Html.HiddenFor(m => comment.Id)
    <button type="submit" class="btn btn-primary"> Comment </button>
}

我正在做一个项目,在“详细信息”视图中

首先,出现了帖子

其次,是评论

第三,新评论的一部分

“详细信息”页面的完整代码

@model SimpleBlog.Models.PostViewModel

@{
    ViewBag.Title = "Details";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@*Post Section*@

<div class="jumbotron">
    <h1> @Model.Post.Title </h1>
    <p class="lead"> @Model.Post.PostedBy </p>
    <p> @Model.Post.PostDate.ToString("d MMM yyyy") </p>

</div>

<br />

<div class="jumbotron">

    <p class="lead"> @Model.Post.Body </p>

</div>


@* Old comments section *@

@foreach (var comment in Model.Comments)
{

    <h4>  @comment.CommentBy  </h4>
    <h4>  @comment.CommentDate.ToString("d MMM yyyy") </h4>
    <h4> @comment.Data  </h4>

    <br />
    <br />

}

@* New Comment section *@

@using (Html.BeginForm("Comment", "Post", Model.Post))
{


    var comment = Model.NewComment;

    <div class="form-group">
        @Html.LabelFor(m => comment.Data);
        @Html.TextAreaFor(m => comment.Data, new { @class = "form-control" })
    </div>

    @Html.HiddenFor(m => comment.Id)
    <button type="submit" class="btn btn-primary"> Comment </button>
}