ASP.Net MVC Невозможно редактировать пользователя из-за [Сравнение (Пароль)] в классе User - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть таблица с именем Korisnik (на моем языке, на английском языке ее Пользователь), и я добавил Edit ActionResult в мой контроллер, но он не будет работать из-за [Compare ("Lozinka")], который сравнивает пароль избаза данных и добавленное свойство PotvrdiLozinku, другими словами, я должен ввести пароль подтверждения, чтобы отправить изменения

namespace ProjekatFinalni.Models

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

public partial class Korisnik
{
    public int KorisnikID { get; set; }
    [DisplayName("Korisnicko ime:")]
    [Required(ErrorMessage ="Molimo vas unesite korisnicko ime.")]
    public string Korisnickoime { get; set; }

    [DisplayName("Lozinka:")]
    [DataType(DataType.Password)]
    [Required(ErrorMessage = "Molimo vas unesite lozinku.")]
    public string Lozinka { get; set; }

    [DisplayName("Admin:")]
    public bool DaLiJeAdmin { get; set; }
    [DisplayName("Gost:")]
    public bool Gost { get; set; }

    [DisplayName("Pravo za unos:")]
    public bool PravoUnosa { get; set; }

    [DisplayName("Potvrdi lozinku:")]
    [DataType(DataType.Password)]
    [Compare("Lozinka",ErrorMessage ="Lozinke se ne poklapaju.")]
    public string PotvrdiLozinku { get; set; }



    public string LoginErrorPoruka { get; set; }
}

Это Edit ActionResult в моем контроллере

public ActionResult Edit(int id)
        {
            using (BazaProjekatEntities4 dbModel = new BazaProjekatEntities4())
            {
                return View(dbModel.Korisniks.Where(x => x.KorisnikID == id).FirstOrDefault());
            }
        }
        [HttpPost]
        public ActionResult Edit(int id,Korisnik k)
        {
            try
            {
                using (BazaProjekatEntities4 dbModel = new BazaProjekatEntities4())
                {
                    dbModel.Entry(k).State = EntityState.Modified;
                    dbModel.SaveChanges();
                }
                return RedirectToAction("Izlistaj");
             }
            catch
            {
                return View();
            }
        }

И этотакое Edit.cshtml

@model ProjekatFinalni.Models.Korisnik

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

<div class="form-horizontal">
    <h4>Korisnik</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    @Html.HiddenFor(model => model.KorisnikID)

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

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

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

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

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



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



    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Sacuvaj" class="btn btn-default" />
        </div>
    </div>
</div>
}

Только хотите редактировать разрешения (Admin, Gost и PravoUnosa

РЕДАКТИРОВАТЬ (добавлена ​​форма регистрации, которую я использовал)

[HttpPost]
        public ActionResult DodajiliIzmeni(Korisnik korisnikmodel)
        {
            using (BazaProjekatEntities4 Modelkorisnik = new BazaProjekatEntities4())
            {
                if(Modelkorisnik.Korisniks.Any(x=> x.Korisnickoime == korisnikmodel.Korisnickoime))
                {
                    ViewBag.DuplicateMessage = "Korisnicko ime vec postoji.";
                    return View("DodajiliIzmeni", korisnikmodel);
                }
                Modelkorisnik.Korisniks.Add(korisnikmodel);
                Modelkorisnik.SaveChanges();
            }
            ModelState.Clear();
            ViewBag.SuccessMessage = "Registracija je uspela";



            return RedirectToAction("Index", "Login");
        }

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Решение было очень простым, и оно может быть с самого начала, мне просто нужно добавить user.PotvrdiLozinku = user.Lozinka;это скажет ему, что пароль Подтверждения равен Паролю (Для [Сравнить], который находится в классе User.:)

[HttpPost]
public ActionResult Edit(EditUserVm model)
{
   var db = new BazaProjekatEntities4();
   var user = db.Korisniks.FirstOrDefault(x => x.KorisnikID == model.Id);
   // to do : Do a null check on user to be safe :)

   // Map the property values from view model to entity object
   user.Admin = model.Admin;
   user.PotvrdiLozinku = user.Lozinka;  // this line was missing
   user.Gost = model.Gost;
   user.PravoUnosa = model.PravoUnosa;

   db.Entry(k).State = EntityState.Modified;
   db.SaveChanges();

   return RedirectToAction("Index");
} 
0 голосов
/ 20 декабря 2018

Вы должны создать модель представления, специфичную для вида, в которой есть свойства и атрибуты проверки, необходимые для представления, и использовать ее для передачи данных между видом и методом действия.

public class EditUserVm
{
    public int Id { get; set; }

    [DisplayName("Korisnicko ime:")]
    public string UserName { get; set; }

    [DisplayName("Admin:")]
    public bool Admin { get; set; }

    [DisplayName("Gost:")]
    public bool Gost { get; set; }

    [DisplayName("Pravo za unos:")]
    public bool PravoUnosa { get; set; }
}

Теперь вы будете использовать эту модель представления для ваших методов действий GET и POST.В вашем методе действия GET сначала создайте объект этой модели представления, затем получите объект Korisniks для переданного идентификатора Id, прочитайте и сопоставьте значения свойств с объектом модели представления и передайте его представлению.

public ActionResult Edit(int id)
{
  using (var dbModel = new BazaProjekatEntities4())
  {
     var user = dbModel.Korisniks.FirstOrDefault(x => x.KorisnikID == id);
     // to do: If user is NULL, return a "Not found" view to user ?

     var vm = new EditUserVm { Id = id };
     vm.UserName = user.UserName;
     vm.Admin = user.Admin;
     vm.Gost = user.Gost;
     vm.PravoUnosa = user.PravoUnosa;
     return View(vm);
  }
}

Теперь убедитесь, что ваше представление строго типизировано для этой модели представления, поскольку мы передаем объект класса EditUserVm.

@model YourNamespaceGoesHere.EditUserVm
@using (Html.BeginForm())
{
  @Html.HiddenFor(a=>a.Id)
  <label>@Model.UserName</label>

  @Html.LabelFor(a=>a.Admin)
  @Html.CheckBoxFor(a=>a.Admin)

  @Html.LabelFor(a=>a.Gost)
  @Html.CheckBoxFor(a=>a.Gost)

  @Html.LabelFor(a=>a.PravoUnosa)
  @Html.CheckBoxFor(a=>a.PravoUnosa)

  <button type="submit" >Save</button>
}

Теперь вы будете использовать ту же модель представления, что ипараметр метода действия.Внутри метода мы снова будем читать сущность User из базы данных и обновлять только поле, которое мы хотим

[HttpPost]
public ActionResult Edit(EditUserVm model)
{
   var db = new BazaProjekatEntities4();
   var user = db.Korisniks.FirstOrDefault(x => x.KorisnikID == model.Id);
   // to do : Do a null check on user to be safe :)

   // Map the property values from view model to entity object
   user.Admin = model.Admin;
   user.Gost = model.Gost;
   user.PravoUnosa = model.PravoUnosa;

   db.Entry(k).State = EntityState.Modified;
   db.SaveChanges();

   return RedirectToAction("Index");
} 

Короче , создайте модель представления со свойствами, абсолютно необходимыми дляпросмотрите / ваш код и используйте его для передачи данных между вашим методом действия и представлением.

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