Asp.net 如何发布仅更改部分viewmodel的viewmodel

Asp.net 如何发布仅更改部分viewmodel的viewmodel,asp.net,asp.net-mvc,asp.net-core,asp.net-web-api,Asp.net,Asp.net Mvc,Asp.net Core,Asp.net Web Api,我正在做一个项目,这是一个具有MVC和API的电影数据库。 用户必须能够对电影进行评论和评分。如果我想显示电影,我会使用一个名为MovieVM的Viewmodel,在这里你可以看到电影的属性和已经发表的评论。我还有一个小表单,用户可以在那里发表新的评论。我可以单独发表评论吗?我需要发布整个viewmodel并再次返回信息吗 @model MMDB_WebApp.Models.MovieVM @{ string Id = null; ViewData["Title"] = "Det

我正在做一个项目,这是一个具有MVC和API的电影数据库。 用户必须能够对电影进行评论和评分。如果我想显示电影,我会使用一个名为MovieVM的Viewmodel,在这里你可以看到电影的属性和已经发表的评论。我还有一个小表单,用户可以在那里发表新的评论。我可以单独发表评论吗?我需要发布整个viewmodel并再次返回信息吗

@model MMDB_WebApp.Models.MovieVM
@{
    string Id = null;
    ViewData["Title"] = "Details";

    if (TempData.ContainsKey("StateData"))
    {
        Dictionary<string, string> stateData = (Dictionary<string, string>)TempData["StateData"];

        Id = stateData["_Id"];
    }

    TempData.Keep();
}

<div>
    <h4>MovieVM</h4>
    <hr />
    @if (Model.Poster != null)
    {
        <img class="float-right" src="~/images/Posters/@Model.Poster" asp-append-version="true">
    }
    else
    {
        <img class="float-right" src="~/images/Posters/not_available.jpg">
    }
    <dl class="row">
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Title)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Title)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Description)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Description)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.ReleaseDate)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.ReleaseDate)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.DirectorId)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.DirectorId)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.DirectorName)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.DirectorName)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Actors)
        </dt>
        <dd class="col-sm-10">
            <ul>
                @foreach (var Actor in Model.Actors)
                {
                <li>
                    <img src="~/images/Avatars/no_avatar.png" />
                    <a asp-action="">@Actor.Name</a>
                </li>
                }
            </ul>
        </dd>
    </dl>
    <div class="row bootstrap snippets">
        <div class="col-md-6 col-md-offset-2 col-sm-12">
            <div class="comment-wrapper">
                <div class="card card-info">
                    <div class="card-header">
                        Comment panel
                    </div>
                    <div class="card-body">
                        <form asp-action="comment" method="post">
                            <input hidden asp-for="NewComment.Date" value="@DateTime.Now" />
                            <input hidden asp-for="NewComment.MovieId" value="@Model.Id" />
                            <input hidden asp-for="NewComment.UserId" value="@Id" />
                            <textarea class="form-control" placeholder="write a comment..." rows="3" asp-for="NewComment.CommentText"></textarea>
                            <br>
                            <button type="submit" class="btn btn-info float-right">Post</button>
                            <div class="clearfix"></div>
                            <hr>
                        </form>

                        @if (Model.Comments.Count() != 0)
                        {
                            <ul class="media-list">
                                @foreach (var Comment in Model.Comments)
                                {
                                    <li class="media">

                                        @if (Comment.UserAvatar != null)
                                        {
                                            <img src="~/images/Avatars/@Comment.UserAvatar" class="img-circle avatar" alt="user profile image">
                                        }
                                        else
                                        {
                                            <img src="~/images/Avatars/no_avatar.png" class="img-circle avatar" alt="user profile image">
                                        }
                                        <div class="media-body">
                                            <span class="text-muted float-right">
                                                <small class="text-muted">@Comment.Date</small>
                                            </span>
                                            <strong class="text-success">@Comment.UserName</strong>
                                            <p>
                                                @Comment.CommentText
                                            </p>
                                        </div>
                                    </li>

                                }
                            </ul>
                        }
                        else
                        {
                            <p>No comments yet</p>
                        }
                    </div>
                </div>
            </div>

        </div>
    </div>
</div>
我可以单独发表评论吗?我需要发布整个viewmodel吗 然后再把信息给我

@model MMDB_WebApp.Models.MovieVM
@{
    string Id = null;
    ViewData["Title"] = "Details";

    if (TempData.ContainsKey("StateData"))
    {
        Dictionary<string, string> stateData = (Dictionary<string, string>)TempData["StateData"];

        Id = stateData["_Id"];
    }

    TempData.Keep();
}

<div>
    <h4>MovieVM</h4>
    <hr />
    @if (Model.Poster != null)
    {
        <img class="float-right" src="~/images/Posters/@Model.Poster" asp-append-version="true">
    }
    else
    {
        <img class="float-right" src="~/images/Posters/not_available.jpg">
    }
    <dl class="row">
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Title)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Title)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Description)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Description)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.ReleaseDate)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.ReleaseDate)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.DirectorId)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.DirectorId)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.DirectorName)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.DirectorName)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Actors)
        </dt>
        <dd class="col-sm-10">
            <ul>
                @foreach (var Actor in Model.Actors)
                {
                <li>
                    <img src="~/images/Avatars/no_avatar.png" />
                    <a asp-action="">@Actor.Name</a>
                </li>
                }
            </ul>
        </dd>
    </dl>
    <div class="row bootstrap snippets">
        <div class="col-md-6 col-md-offset-2 col-sm-12">
            <div class="comment-wrapper">
                <div class="card card-info">
                    <div class="card-header">
                        Comment panel
                    </div>
                    <div class="card-body">
                        <form asp-action="comment" method="post">
                            <input hidden asp-for="NewComment.Date" value="@DateTime.Now" />
                            <input hidden asp-for="NewComment.MovieId" value="@Model.Id" />
                            <input hidden asp-for="NewComment.UserId" value="@Id" />
                            <textarea class="form-control" placeholder="write a comment..." rows="3" asp-for="NewComment.CommentText"></textarea>
                            <br>
                            <button type="submit" class="btn btn-info float-right">Post</button>
                            <div class="clearfix"></div>
                            <hr>
                        </form>

                        @if (Model.Comments.Count() != 0)
                        {
                            <ul class="media-list">
                                @foreach (var Comment in Model.Comments)
                                {
                                    <li class="media">

                                        @if (Comment.UserAvatar != null)
                                        {
                                            <img src="~/images/Avatars/@Comment.UserAvatar" class="img-circle avatar" alt="user profile image">
                                        }
                                        else
                                        {
                                            <img src="~/images/Avatars/no_avatar.png" class="img-circle avatar" alt="user profile image">
                                        }
                                        <div class="media-body">
                                            <span class="text-muted float-right">
                                                <small class="text-muted">@Comment.Date</small>
                                            </span>
                                            <strong class="text-success">@Comment.UserName</strong>
                                            <p>
                                                @Comment.CommentText
                                            </p>
                                        </div>
                                    </li>

                                }
                            </ul>
                        }
                        else
                        {
                            <p>No comments yet</p>
                        }
                    </div>
                </div>
            </div>

        </div>
    </div>
</div>
您可以通过值将注释模型单独传递给控制器,并且不需要传递整个viewmodel,甚至不需要NewComment字段

您只需确保提交表单中相应字段的name属性与您的注释模型一致, 将所需信息传递给注释,并将其存储在注释表中

   <form asp-action="comment" method="post">
                            <input hidden name="Date" value="@DateTime.Now" />
                            <input hidden name="MovieId" value="@Model.Id" />
                            <input hidden name="UserId" value="@Id" />
                            <textarea  name="CommentText" class="form-control" placeholder="write a comment..." rows="3" ></textarea>
                            <br>
                            <button type="submit" class="btn btn-info float-right">Post</button>
                            <div class="clearfix"></div>
                            <hr>
  </form>
以下是测试结果:


您应该使用Ajax发布评论,而不是发布整个页面。
   <form asp-action="comment" method="post">
                            <input hidden name="Date" value="@DateTime.Now" />
                            <input hidden name="MovieId" value="@Model.Id" />
                            <input hidden name="UserId" value="@Id" />
                            <textarea  name="CommentText" class="form-control" placeholder="write a comment..." rows="3" ></textarea>
                            <br>
                            <button type="submit" class="btn btn-info float-right">Post</button>
                            <div class="clearfix"></div>
                            <hr>
  </form>
 [HttpPost]
        public IActionResult comment(CommentVM newcomment)
        {
           //save this new comment to the comment table which related to the movie table.
            _context.CommentVM.Add(newcomment);
            _context.SaveChanges(); 
            return RedirectToAction("Index");
        }