簡體   English   中英

如何在同一視圖中具有“細節”和“創建”? MVC

[英]How to have 'details' and 'create' in same view? MVC

下面的代碼(在控制器中)從上一頁讀取特定的行數據(通過View內部的@Html.ActionLink("Details", "Details", new { id=item.Id })獲取id

       public ActionResult Details(Guid? id) {           

        if (id == null) {
            return Content("id = null..");
        }
        Review review = db.Reviews.Find(id);
        if (review == null)
        {
            return Content("review = null.. ");
        }
        return View(review);
    }

到目前為止一切順利,但現在我想允許訪問者/用戶發表評論,喜歡/不喜歡等等。 我想這是View的細節/創建(換句話說,讀/插入)模板的組合? 我必須在控制器中做什么才能使其正常工作?

從這里開始,我不知道該做什么,因為我是MVC的新手。

這是我的數據庫的樣子:( 從EF-model(Database-first)中選取):

用戶:

    public System.Guid Id { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }

評論:(作者創建評論的地方)

    public System.Guid Id { get; set; }
    public System.Guid CreatorUserId { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public System.DateTime CreatedDate { get; set; }
    public int UserRating { get; set; }
    public int LikeCount { get; set; } 
    public int DislikeCount { get; set; }

CommentReview :(從其他用戶獲得評論的評論)

    public System.Guid Id { get; set; }
    public System.Guid UserId { get; set; }
    public System.Guid ReviewId { get; set; }
    public string Comment { get; set; }
    public System.DateTime CreatedDate { get; set; } 

UserReview :(如果用戶已經喜歡過該評論,則避免多次喜歡)

    public System.Guid Id { get; set; }
    public System.Guid UserId { get; set; }
    public System.Guid ReviewId { get; set; }
    public bool HasLiked { get; set; }

這是用於顯示有關選定行的詳細信息的視圖的樣子:

 <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.Title)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Title)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Description)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Description)
        </dd>
@*  ... and so on.  Not sure how to add "create"-inputs for e.g. comments etc*@

我正在使用Session["LoggedUserID"]獲取當前用戶的Id

首先,稍微更改一下實體以配置它們之間的關系:

public class User
{
    [Key]
    public System.Guid Id { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }

    public virtual ICollection<CommentToReview> Comments { get; set; }
    public virtual ICollection<UserToReview> Reviews { get; set; }
}

public class Review
{
   [Key]
   public System.Guid Id { get; set; }
   public System.Guid CreatorUserId { get; set; }
   public string Title { get; set; }
   public string Description { get; set; }
   public System.DateTime CreatedDate { get; set; }
   public int UserRating { get; set; }
   public int LikeCount { get; set; }
   public int DislikeCount { get; set; }

   public virtual ICollection<CommentToReview> Comments { get; set; }
   public virtual ICollection<UserToReview> Users { get; set; }
}

public class CommentToReview
{
    [Key]
    public System.Guid Id { get; set; }
    [ForeignKey("User")]
    public System.Guid UserId { get; set; }
    public virtual User User { get; set; }
    [ForeignKey("Review")]
    public System.Guid ReviewId { get; set; }
    public virtual Review Review { get; set; }
    public string Comment { get; set; }
    public System.DateTime CreatedDate { get; set; } 
}

public class UserToReview
{
    [Key]
    public System.Guid Id { get; set; }
    [ForeignKey("User")]
    public System.Guid UserId { get; set; }
    public virtual User User { get; set; }
    [ForeignKey("Review")]
    public System.Guid ReviewId { get; set; }
    public virtual Review Review { get; set; }
    public bool HasLiked { get; set; }
}

現在轉到ReviewsController並添加此操作,以為其添加新注釋:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult CreateComment([Bind(Include = "Id,UserId,ReviewId,Comment,CreatedDate")] CommentToReview commentToReview)
    {
        if (ModelState.IsValid)
        {
            commentToReview.Id = Guid.NewGuid();
            commentToReview.UserId = Session["LoggedUserID"].ToString();
            commentToReview.CreatedDate = DateTime.Now;
            db.CommentToReviews.Add(commentToReview);
            db.SaveChanges();
            return RedirectToAction("Details", "Reviews", new { id = commentToReview.ReviewId });
        }

        return RedirectToAction("Details", "Reviews", new { id = commentToReview.ReviewId });
    }

然后,您應該在Views / Review文件夾下的PartialViews下面創建:

_CreateCommentPartial.cshtml:用於在同一頁的詳細信息中創建注釋

@using (Html.BeginForm("CreatePartial", "Reviews"))
{
@Html.AntiForgeryToken()   
<div class="form-horizontal">
    <h4>CommentToReview</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    @Html.HiddenFor(model=> model.ReviewId)

    <div class="form-group">
        @Html.LabelFor(model => model.Comment, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Comment, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Comment, "", new { @class = "text-danger" })
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
</div>
}


@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}

_CommentDetailPartial.cshtml:用於顯示現有評論的詳細信息

@model MvcApp.Models.CommentToReview


<div class="panel panel-default">
<div class="panel-heading">@Model.User.Email</div>
<div class="panel-body">
    @Model.Comment
</div>
<div class="panel-footer">@Model.CreatedDate.ToString()
</div>
</div>

最后,修改“評論”的“詳細信息”視圖(Views / Reviews / Details.cshtml)

@model MvcApp.Models.Review

@{
   ViewBag.Title = "Details";
}

<h2>Details</h2>

<div>
<h4>Review</h4>
<hr />
<dl class="dl-horizontal">
    <dt>
        @Html.DisplayNameFor(model => model.Title)
    </dt>

    <dd>
        @Html.DisplayFor(model => model.Title)
    </dd>

    <dt>
        @Html.DisplayNameFor(model => model.Description)
    </dt>

    <dd>
        @Html.DisplayFor(model => model.Description)
    </dd>

    <dt>
        @Html.DisplayNameFor(model => model.CreatedDate)
    </dt>

    <dd>
        @Html.DisplayFor(model => model.CreatedDate)
    </dd>    
</dl>
<h6>Comments</h6>
<hr />
@foreach(var comment in Model.Comments)
{
    Html.RenderPartial("_CommentDetailsPartial.cshtml", comment);
}

<br />
@{
    var newComment = new MvcApp.Models.CommentToReview { ReviewId = Model.Id         };

    Html.RenderPartial("_CreateComment", newComment);
}
</div>
<p>
    @Html.ActionLink("Edit", "Edit", new { id = Model.Id }) |
    @Html.ActionLink("Back to List", "Index")
</p>

請注意,為簡單起見,我在Review Controller和View下創建了所有PartialViews和操作。 並且當您添加新評論時,它會刷新頁面,也許最好使用ajax以獲得更好的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM