Mvc добавить пользователя и редактировать пользователя в одном представлении

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

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

Я попытался вернуть представление индекса (представление, в котором оба частичных представления отображаются правильно), когда я нажимаю кнопку «Изменить», но как мне передать ему идентификатор пользователя, поскольку это представление уже возвращается как список пользователей.

Вот код AccountController:

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using NEASports.Models;

namespace NEASports.Controllers
{
    public class AccountController : Controller
    {
        OurDBContext db = new OurDBContext();
        // GET: Account
        public ActionResult Index()
        {



                return View(db.userAccount.ToList());            



        }

        // GET Akcije za registraciju
        public ActionResult Register(int id)
        {

            return View("_UserEditPartial", db.userAccount.Find(id));

        }

        //Post Akcija za registraciju
        [HttpPost]
        public ActionResult Register(UserAccount account)
        {
            if (ModelState.IsValid)
            {
                if (account.Id <= 0)
                {

                    db.userAccount.Add(account);

                    ModelState.Clear();
                    ViewBag.Message = account.FirstName + " " + account.LastName + " uspješno registrovan.";
                }
                else
                {
                    db.Entry(account).State = EntityState.Modified;

                }
                db.SaveChanges();
                return RedirectToAction("Index");


            }

            return View(account);
        }



        // Akcije za Logon
        public ActionResult Login()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Login(UserAccount user)
        {


                    var usr = db.userAccount.FirstOrDefault(u => u.Username == user.Username && u.Password == user.Password);
                    if (usr != null)
                    {
                        Session["Id"] = usr.Id.ToString();
                        Session["Username"] = usr.Username.ToString();
                        Session["FirstName"] = usr.FirstName.ToString();
                        Session["LastName"] = usr.LastName.ToString();
                        return RedirectToAction("Index");
                    }
                    else
                    {
                        ModelState.AddModelError("", "Pogrešan Username ili Password");
                    }


            return View();
        }

        public ActionResult LoggedIn()
        {
            if (Session["Id"] != null)
            {
                return View();
            }
            else
            {
                return RedirectToAction("Login");
            }
        }
    }
}

Это код просмотра индекса:

@model IEnumerable<NEASports.Models.UserAccount>

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Message = "Lista korisnika";

}

@{
    NEASports.Models.UserAccount user = new NEASports.Models.UserAccount();
}

<div>

    @{ 
        Html.RenderPartial("_UserEditPartial", user);
    }


</div>

<div>
    @{
        Html.RenderPartial("_UserListPartial");
    }
</div>

Это код частичного просмотра UserList:

@model IEnumerable<NEASports.Models.UserAccount>

<div class="box box-info">

    <div class="box-header with-border">
        <h3 class="box-title">@ViewBag.Message</h3>
        <div class="box-tools pull-right">
            <button type="button" class="btn btn-box-tool" data-widget="collapse" data-toggle="tooltip"
                    title="Collapse">
                <i class="fa fa-minus"></i>
            </button>
            <button type="button" class="btn btn-box-tool" data-widget="remove" data-toggle="tooltip" title="Remove">
                <i class="fa fa-times"></i>
            </button>
        </div>
    </div>
    <div class="box-body">


        <div>
            <table id="table1" class="table table-bordered table-striped">
                <thead>
                    <tr>
                        <th>@Html.DisplayNameFor(model => model.FirstName)</th>
                        <th>@Html.DisplayNameFor(model => model.LastName)</th>
                        <th>@Html.DisplayNameFor(model => model.Email)</th>
                        <th>@Html.DisplayNameFor(model => model.Username)</th>
                        <th></th>
                    </tr>
                </thead>
                <tbody>
                    @foreach (var item in Model)
                    {
                        <tr>
                            <td>@Html.DisplayFor(modelItem => item.FirstName)</td>
                            <td>@Html.DisplayFor(modelItem => item.LastName)</td>
                            <td>@Html.DisplayFor(modelItem => item.Email)</td>
                            <td>@Html.DisplayFor(modelItem => item.Username)</td>
                            <td>
                                @Html.ActionLink("Edit", "Register", new { id = item.Id }) |
                                @Html.ActionLink("Details", "Details", new { id = item.Id }) |
                                @Html.ActionLink("Delete", "Delete", new { id = item.Id })
                            </td>
                        </tr>
                    }
                </tbody>
                <tfoot>
                    <tr>
                        <th>@Html.DisplayNameFor(model => model.FirstName)</th>
                        <th>@Html.DisplayNameFor(model => model.LastName)</th>
                        <th>@Html.DisplayNameFor(model => model.Email)</th>
                        <th>@Html.DisplayNameFor(model => model.Username)</th>
                        <th></th>
                    </tr>
                </tfoot>
            </table>

        </div>
    </div>
    <!-- /.box-body -->
    <div class="box-footer">
        Lista svih korisnika
    </div>
    <!-- /.box-footer-->
</div>

И код частичного просмотра пользователя Edit:

@model NEASports.Models.UserAccount    

@{
    ViewBag.Title = "Register";
    ViewBag.Message = "Administracija Korisnika";
}

<div class="box box-danger">
    <div class="box-header with-border">
        <h3 class="box-title">@ViewBag.Message</h3>
        <div class="box-tools pull-right">
            <button type="button" class="btn btn-box-tool" data-widget="collapse" data-toggle="tooltip"
                    title="Collapse">
                <i class="fa fa-minus"></i>
            </button>
            <button type="button" class="btn btn-box-tool" data-widget="remove" data-toggle="tooltip" title="Remove">
                <i class="fa fa-times"></i>
            </button>
        </div>
    </div>
    <div class="box-body">

        @using (Html.BeginForm("Register", "Account"))
        {
        @Html.AntiForgeryToken()
        <form role="form">
            <div class="form-horizontal">


                @Html.ValidationSummary(true, "", new { @class = "text-danger" })
                @if (ViewBag.Message != null)
            {

            }
                <div class="row">
                    <div class="col-sm-6">
                        <div class="form-group">
                            @Html.LabelFor(model => model.FirstName, htmlAttributes: new { @class = "col-sm-2 control-label" })
                            <div class="col-sm-8">
                                @Html.HiddenFor(model => model.Id)
                                @Html.EditorFor(model => model.FirstName, new { htmlAttributes = new { @class = "form-control", @placeholder = "Unesite Ime" } })
                                @Html.ValidationMessageFor(model => model.FirstName, "", new { @class = "text-danger" })
                            </div>
                        </div>

                        <div class="form-group">
                            @Html.LabelFor(model => model.LastName, htmlAttributes: new { @class = "col-sm-2 control-label" })
                            <div class="col-sm-8">
                                @Html.EditorFor(model => model.LastName, new { htmlAttributes = new { @class = "form-control", @placeholder = "Unesite Prezime" } })
                                @Html.ValidationMessageFor(model => model.LastName, "", new { @class = "text-danger" })
                            </div>
                        </div>

                        <div class="form-group">
                            @Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "col-sm-2 control-label" })
                            <div class="col-sm-8">
                                @Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control", @placeholder = "Unesite Email" } })
                                @Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
                            </div>

                        </div>
                    </div>


                    <div class="col-md-6">
                        <div class="form-group">
                            @Html.LabelFor(model => model.Username, htmlAttributes: new { @class = "col-sm-4 control-label" })
                            <div class="col-sm-8">
                                @Html.EditorFor(model => model.Username, new { htmlAttributes = new { @class = "form-control", @placeholder = "Unesite Username" } })
                                @Html.ValidationMessageFor(model => model.Username, "", new { @class = "text-danger" })
                            </div>
                        </div>

                        <div class="form-group">
                            @Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "col-sm-4 control-label" })
                            <div class="col-sm-8">
                                @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control", @placeholder = "Unesite Password" } })
                                @Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
                            </div>
                        </div>

                        <div class="form-group">
                            @Html.LabelFor(model => model.ConfirmPassword, htmlAttributes: new { @class = "col-sm-4 control-label" })
                            <div class="col-sm-8">
                                @Html.EditorFor(model => model.ConfirmPassword, new { htmlAttributes = new { @class = "form-control", @placeholder = "Ponovite Password" } })
                                @Html.ValidationMessageFor(model => model.ConfirmPassword, "", new { @class = "text-danger" })
                            </div>
                        </div>
                    </div>
                    <div class="col-sm-10">
                        <div class="form-group">
                            <div class="col-sm-offset-0 col-sm-12">
                                <input type="submit" value="Sačuvaj" class="btn btn-success" />
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </form>
        }

    </div>


    <!-- /.box-body -->
    <div class="box-footer">
        Otvaranje novih ili ažuriranje postojećih korisnika
    </div>
    <!-- /.box-footer-->
</div>
0
0
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Нажав кнопку «Изменить», вы можете сделать одно из двух:

1- Без перезагрузки страницы (с использованием javascript)

(а) Возьмите соответствующие значения для пользователя из List

(b) Заполните форму EditUser этими значениями без перенаправления страницы.

2- С перезагрузкой страницы (без javascript)

(а) Маршрут / возврат к просмотру Index

(b) В вашем контроллере (перед загрузкой представления Index) проверьте, вызывается ли Index из кнопки редактирования.

(c) Если да, то возьмите данные $_POST и передайте их представлению EditUser.

(d) В представлении EditUser проверьте, получены / установлены ли какие-либо данные для пользователя. Если это так, заполните форму соответствующим образом.

Ответ принят как подходящий

@ Html.ActionLink перенаправит вашу страницу, чего вы хотите избежать. Таким образом, чтобы сохранить ваш контент и обновлять только определенный раздел, вы должны использовать Вызов Ajax.

  1. Сначала замените @ Html.ActionLink элементом без гиперссылки, например div, section, ...

<span class="EditUser" data-id="@item.Id">edit</span>
  1. Добавьте идентификатор в div, в котором вы хотите отобразить частичное представление, как показано ниже:

<div id="EditUserSection">
    @{ 
        Html.RenderPartial("_UserEditPartial", user);
    }
</div>
  1. И, наконец, добавьте файл JavaScript, такой как ниже (включая jQuery)

$(document).on('click', '.EditUser', function () {

    var id = $(this).data('id');

    $.ajax({
        url: "/Account/Register?id=" + id,
        cache: false,
        success: function (partialView) {

            $('#EditUserSection').html(partialView);
        },
        error: function (x, y, z) {

            // Handle Exception
        }
    });

});

Другие вопросы по теме