Как объединить вложенные модельные лямбды в синтаксисе бритвы - PullRequest
0 голосов
/ 11 января 2019

My View Model

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 голосов
/ 12 января 2019

Эхсан Саджад. Я понял, что мы можем написать лямбда-выражение вроде этого

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

позже я решил свою проблему, на самом деле мой подход был совершенно неверным

для решения моей проблемы я добавляю еще один компонент NewComment в свою ViewModel

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>
}
0 голосов
/ 11 января 2019

Ваш лямбда-синтаксис неверен. Следующее скомпилируется и будет работать, но значения не будут отправлены обратно в действие контроллера:

@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>

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...