Edytowanie recenzji w widoku ASP.NET

0

Cześć,
Mam prośbę po uruchomieniu projektu nie widzę żadnych błędów ale nie mogę edytować dodanej recenzji w widoku nie wiem, czy możecie coś podpowiedzieć gdzie robię błąd :)
(https://pastebin.com/9BNbha9Y)

0

Nie wyjaśniłeś co masz na myśli pisząc że nie możesz edytować, ani nie dałeś kodu widoku (chyba że ja go nie widzę w wersji mobilnej). Proponuję również zapoznać się z debugerem.

0
Aventus napisał(a):

Nie wyjaśniłeś co masz na myśli pisząc że nie możesz edytować, ani nie dałeś kodu widoku (chyba że ja go nie widzę w wersji mobilnej). Proponuję również zapoznać się z debugerem.

Jak nie widzisz to wrzuciłem w poście link do pastebin :)
Dodam tylko iż to jest jeden z kontrolerów w którym nie wiem czemu nie działa edytowanie istniejących komentarzy.

using Shop.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
 
namespace Shop.Controllers
{
    [Authorize]
    public class ReviewsController : BaseController
    {
        // GET: Reviews
        public ActionResult Index([Bind (Prefix ="Id")]int productId)
        {
            var product = _db.Products.Find(productId);
 
            if(product != null)
            {
                return View(product);
            }
 
            return HttpNotFound();
        }
        public ActionResult Create(int productId)
        {
            return View();
        }
        [HttpPost]
        public ActionResult Create(Review model)
        {
            if(ModelState.IsValid)
            {
                model.Name = User.Identity.Name;
                _db.Reviews.Add(model);
                _db.SaveChanges();
 
                return RedirectToAction("Index", new { id = model.ProductId });
            }
            return View(model);
        }
        public ActionResult Edit (int id)
        {
            var review = _db.Reviews.Find(id);
 
            if (review.Name == User.Identity.Name)
            {
                if (review != null)
                {
                    return View(review);
                }
            }
            return RedirectToAction("Index", "Products");
        }
        [HttpPost]
        public ActionResult Edit(Review model)
        {
            if (model.Name == User.Identity.Name)
            {
                if (ModelState.IsValid)
                {
                    _db.Entry(model).State = System.Data.Entity.EntityState.Modified;
                    _db.SaveChanges();
 
                    return RedirectToAction("Index", new { id = model.ProductId });
                }
            }
            return View(model);
        }
    }
}
0

To widziałem, ale to kod kontrolera. Brakuje natomiast kodu widoku (zależnie od tego co używasz może to być plik z rozszerzeniem .cshtml lub .razor i chyba coś tam jeszcze). Poza tym nadal nie wyjaśniłeś co rozumiesz przez "nie działa".

0
Aventus napisał(a):

To widziałem, ale to kod kontrolera. Brakuje natomiast kodu widoku (zależnie od tego co używasz może to być plik z rozszerzeniem .cshtml lub .razor i chyba coś tam jeszcze). Poza tym nadal nie wyjaśniłeś co rozumiesz przez "nie działa".

Jak edytuję dodany komentarz to przy zmianie na inne wartości powinien mi się zapisać ze zmienionymi wartościami ale niestety nie działa.
Kod widoku Edit:

@model Shop.Models.Review

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>

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

        <div class="form-group">
            @Html.LabelFor(model => model.Rating, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Rating, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Rating, "", new { @class = "text-danger" })
            </div>
        </div>

        @Html.HiddenFor(model => model.ProductId)

        <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="Save" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index", new { id = Model.ProductId })
</div>

Kod widoku _Review

@model IEnumerable<Shop.Models.Review>


<ul>
    @foreach (var item in Model)
    {
        
    <li>
        <div>
            <h4>@item.Rating /10</h4>
            <small>Author name: @item.Name @if(User != null && User.Identity != null && item.Name == User.Identity.Name) { @Html.ActionLink("Edit", "Edit", new { id = item.Id })} </small>
        </div>
        <p>@Html.DisplayFor(modelItem => item.Comment)</p>
        
    </li>
    }
</ul>


0

@luki1833: już sporo czasu minęło od kiedy robiłem coś w MVC więc mogłem coś pokręcić. W metodzie kontrolera sprawdzasz if (model.Name == User.Identity.Name), natomiast z tego co widzę nigdzie tego nie przechowujesz po stronie widoku, co oznacza że kiedy robisz submit to model prawdpodobnie gubi imię użytkownika, co za tym idzie ten pierwszy if zwraca false. Musisz dodać ukrytą kontrolkę w widoku:

@Html.HiddenFor(model => model.Name)

Raz jeszcze zachęcam do zapoznania się z debugerem bo to dużo ułatwia. Wtedy już dawno wykryłbyś że kontroler nie dostaje imienia w modelu.

0
Aventus napisał(a):

@luki1833: już sporo czasu minęło od kiedy robiłem coś w MVC więc mogłem coś pokręcić. W metodzie kontrolera sprawdzasz if (model.Name == User.Identity.Name), natomiast z tego co widzę nigdzie tego nie przechowujesz po stronie widoku, co oznacza że kiedy robisz submit to model prawdpodobnie gubi imię użytkownika, co za tym idzie ten pierwszy if zwraca false. Musisz dodać ukrytą kontrolkę w widoku:

@Html.HiddenFor(model => model.Name)

Raz jeszcze zachęcam do zapoznania się z debugerem bo to dużo ułatwia. Wtedy już dawno wykryłbyś że kontroler nie dostaje imienia w modelu.

@Aventus Dzieki za odpowiedź tylko do którego widoku to wkleic ?

@html.HiddenFor(model => model.Name)

1

Do widoku odpowiadającego za edycję recenzji, tam gdzie masz inne ukryte pola (HiddenFor). Wtedy, po wysłaniu modelu do widoku przy requeście GET i wysłaniu go z powrotem w requeście POST model będzie miał zachowaną wartość Name. Swoją drogą to w tym kodzie masz buga:

if (review.Name == User.Identity.Name)
            {
                if (review != null)
                {
                    return View(review);
                }
            }

Sprawdasz czy review jest null po tym jak wcześniej wykonałeś review.Name. Jeśli review rzeczywiście będzie nullem to kod rzuci Ci NullReferenceException. Musisz odwrócić tę logikę. Poza tym zamiast zagnieżdżać IFy możesz mieć po prostu jeden:

if (review != null && review.Name == User.Identity.Name)

Powinieneś również dodać kod który wyśle wszelkie błędy do widoku, wtedy będziesz widział co jest nie tak. Między innymi dla tego że nie obsługujesz błędów walidacji tylko po prostu zwracasz "czysty" widok jak coś idzie nie tak nie wiedziałeś w czym tkwi problem.

Ps: Swoją drogą to formatuj kod który wklejasz, możesz to zrobić w edytorze postu.

0
Aventus napisał(a):

Do widoku odpowiadającego za edycję recenzji, tam gdzie masz inne ukryte pola (HiddenFor). Wtedy, po wysłaniu modelu do widoku przy requeście GET i wysłaniu go z powrotem w requeście POST model będzie miał zachowaną wartość Name. Swoją drogą to w tym kodzie masz buga:

if (review.Name == User.Identity.Name)
            {
                if (review != null)
                {
                    return View(review);
                }
            }

Sprawdasz czy review jest null po tym jak wcześniej wykonałeś review.Name. Jeśli review rzeczywiście będzie nullem to kod rzuci Ci NullReferenceException. Musisz odwrócić tę logikę. Poza tym zamiast zagnieżdżać IFy możesz mieć po prostu jeden:

if (review != null && review.Name == User.Identity.Name)

Powinieneś również dodać kod który wyśle wszelkie błędy do widoku, wtedy będziesz widział co jest nie tak. Między innymi dla tego że nie obsługujesz błędów walidacji tylko po prostu zwracasz "czysty" widok jak coś idzie nie tak nie wiedziałeś w czym tkwi problem.

Ps: Swoją drogą to formatuj kod który wklejasz, możesz to zrobić w edytorze postu.

@Aventus dopiero co rozpoczynam swoją naukę z MVC. Dziękuję za uwagi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1