Asp.net 如何发布仅更改部分viewmodel的viewmodel
我正在做一个项目,这是一个具有MVC和API的电影数据库。 用户必须能够对电影进行评论和评分。如果我想显示电影,我会使用一个名为MovieVM的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
@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");
}