Получение значений из контейнера выпадающего списка из представления - MVC - PullRequest
0 голосов
/ 08 октября 2018

Привет, ребята. У меня есть приложение MVC, и я пытаюсь получить значения из моего контейнера выпадающего списка.Я пытался получить вещи, которые рекомендуются таким образом Как получить DropDownList SelectedValue в контроллере в MVC , но он работает в некоторых случаях, но не работает в других.

На мой взгляд, яиметь два раскрывающихся списка контейнеров и две кнопки для выбора и удаления из одного списка в другой (разветвление javascript).

Когда у меня есть 3 автора в контейнере ChoosenAuthos, и я удаляю только одного из них, в моем контроллере в операторе if я получаю, что Request.Form ["ChoosenAuthors"] равен нулю, и у него осталось два авторав контейнере.

My View:

@model PrivateLibrary.Models.Book

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>
<script src='https://code.jquery.com/jquery-3.1.0.min.js'></script>
<script type="text/javascript" src="~/Scripts/CreateBook.js"></script>


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

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

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

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

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

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

    <div class="form-group">
        <div class="container">
            <div class="row">
                <div class="col-sm-2">
                    <b>Authors: </b>
                    @Html.DropDownList("Authors", new SelectList(ViewBag.Authors, "Value", "Text"), htmlAttributes: new { size = "10", @class = "form-control", Multiple = "multiple", style = "width:150px;height : 200px" })
                </div>
                <div class="col-sm-2 btn-group-vertical">
                    <br><br><br>
                    <button type="button" class="btn btn-primary btn-md" id="choose">Choose</button>
                    <button type="button" class="btn btn-primary btn-md" id="remove">Remove</button>
                </div>
                <div class="col-sm-2">
                    <b>Choosen Authors:</b><br>
                    @Html.DropDownList("ChoosenAuthors", new SelectList(ViewBag.ChoosenAuthors, "Value", "Text"), htmlAttributes: new { size = "10", @class = "form-control", Multiple = "multiple", style = "width:150px;height : 200px" })
                </div>
            </div>
        </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")
</div>

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

Мой javascript, запущенный на этой странице:

$(function () {
$('#choose').click(function () {
    inHTML = "";
    $("#Authors option:selected").each(function () {
        inHTML += '<option value="' + $(this).val() + '">' + $(this).text() + '</option>';
    });
    $("#Authors option:selected").remove();
    $("#ChoosenAuthors").append(inHTML);
});

$('#remove').click(function () {
    inHTML = "";
    $("#ChoosenAuthors option:selected").each(function () {
        inHTML += '<option value="' + $(this).val() + '">' + $(this).text() + '</option>';
    });
    $("#ChoosenAuthors option:selected").remove();
    $("#Authors").append(inHTML);
});

$("form").submit(function (e) {
    $("#ChoosenAuthors option").attr("selected", "selected");
});

});

Мой контроллер:

private bool ContainsAuthor(int authorId, List<BookAuthor> authors)
    {
        foreach (BookAuthor bookAuthor in authors)
        {
            if(bookAuthor.Author_Id == authorId)
            {
                return true;
            }
        }
        return false;
    }

    private void FillChoosenAuthors(BookCorrect book)
    {
        List<SelectListItem> choosen = new List<SelectListItem>();
        List<SelectListItem> authors = new List<SelectListItem>();
        List<Author> allAuthors = db.Author.ToList();
        List<BookAuthor> authorsFromBook = book.BookAuthor.ToList();
        if (authorsFromBook.Any())
        {
            foreach (BookAuthor choosenAuthor in authorsFromBook)
            {
                choosen.Add(new SelectListItem { Text = choosenAuthor.Author.Author_Name, Value = choosenAuthor.Author.Author_Name });

            }
            foreach (Author author in allAuthors)
            {
                if (!ContainsAuthor(author.Author_Id, authorsFromBook))
                {
                    authors.Add(new SelectListItem { Text = author.Author_Name, Value = author.Author_Name });
                }
            }
        }
        else
        {
            foreach (Author author in allAuthors)
            {
                authors.Add(new SelectListItem { Text = author.Author_Name, Value = author.Author_Name });
            }
        }
        ViewBag.Authors = authors;
        ViewBag.ChoosenAuthors = choosen;
    }


 [Filters.AdminBookAuthorization]
    public ActionResult Edit(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        BookCorrect bookCorrect = db.BookCorrect.Find(id);
        if (bookCorrect == null)
        {
            return HttpNotFound();
        }
        FillChoosenAuthors(bookCorrect);
        return View(bookCorrect);
    }

    // POST: BookCorrects/Edit/5
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "Book_Id,Book_Name,ISBN_Number,Book_Desription,User_Id")] BookCorrect bookCorrect)
    {
        if (ModelState.IsValid)
        {
            if (bookCorrect.ISBN_Number.All(Char.IsLetter))
            {
                ModelState.AddModelError("", "ISBN is not valid. No letters in ISBN number");
                return View(bookCorrect);
            }
            db.Entry(bookCorrect).State = EntityState.Modified;

            if (Request.Form["ChoosenAuthors"] != null)
            {
                string choosenAuthors = Request.Form["ChoosenAuthors"].ToString();
                string[] authorsNames = choosenAuthors.Split(',');
                List<BookAuthor> authorsNew = new List<BookAuthor>();

                foreach (var item in db.Author)
                {
                    BookAuthor bookAuthor = new BookAuthor();
                    for (int i = 0; i < authorsNames.Length; i++)
                    {
                        if (authorsNames[i].Equals(item.Author_Name))
                        {
                            bookAuthor.Author = item;
                            bookAuthor.Author_Id = item.Author_Id;
                            bookAuthor.BookCorrect = bookCorrect;
                            bookAuthor.BookAuthor_Id = bookCorrect.Book_Id;
                            authorsNew.Add(bookAuthor);
                        }
                    }
                }
                foreach (BookAuthor bookAuthor in db.BookAuthor)
                { 
                    if(bookAuthor.Book_Id == bookCorrect.Book_Id)
                    {
                        bookCorrect.BookAuthor.Remove(bookAuthor);
                        db.BookAuthor.Remove(bookAuthor);
                    }
                }

                db.SaveChanges();
                foreach (BookAuthor choosen in authorsNew)
                {
                    db.BookAuthor.Add(choosen);
                    bookCorrect.BookAuthor.Add(choosen);
                }
            }else
            {
                foreach (BookAuthor bookAuthor in db.BookAuthor)
                {
                    if (bookAuthor.Book_Id == bookCorrect.Book_Id)
                    {
                        bookCorrect.BookAuthor.Remove(bookAuthor);
                        db.BookAuthor.Remove(bookAuthor);
                    }
                }
            }
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        ViewBag.User_Id = new SelectList(db.LibraryUser, "User_Id", "Username", bookCorrect.User_Id);
        return View(bookCorrect);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...