Вставка значения DropDownList в базу данных в качестве внешнего ключа - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь вставить categoryID в таблицу Post, но мой код создает новую категорию вместо использования выбранного значения из выпадающего списка.

Я начинаю изучать ASP.NET MVC, поэтому не знаю, как мне это решить. Я могу получить реальное значение из выпадающего списка, но когда выполняется запрос на вставку, он вставляет новую категорию и приписывает ее публикации после вставки.

public ActionResult Create([Bind(Include = "PostID,Text,CategoryID")] Posts posts)
{
    if (ModelState.IsValid)
    {
        int CategoryID = Convert.ToInt32(Request["CategoryID"]);
        posts.Category = new Categories { CategoryID = CategoryID };
        db.Posts.Add(posts);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(posts);
}

public ActionResult Create()
{
    ViewBag.CategoryID = new SelectList(db.Categories, "CategoryID", "Name");
    return View();
}

Посмотреть код:

   <h2>Create</h2>


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

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

                Categoria:<br />
                @Html.DropDownList("CategoryID", "Selecione uma categoria")
            </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>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

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

Почтовая модель:

 public class Post
{
    [Key]
    public int PostID { get; set; } /*PRIMARY KEY*/
    public string Text { get; set; }

    public virtual Categories Category { get; set;} /*ONE POST HAS ONLY ONE CATEGORY*/ //

}

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Сначала напишите свой Post класс модели следующим образом:

public class Post
{
    [Key]
    public int PostId {get; set;}

    public string Text {get; set;}

    [ForeignKey("Category")]
    public int CategoryID {get; set;}

    public Category Category {get; set;}
}

Глядя на ваш Create метод записи, кажется, что проблема заключается в следующих двух строках:

int CategoryID = Convert.ToInt32(Request["CategoryID"]);
posts.Category = new Categories { CategoryID = CategoryID };

Удалите эти две строки кода! вам не нужно присваивать Category Post, создавая новый Category с CategoryId, идущим с Post. Сохраните ваш Create метод записи простым, как показано ниже, и он должен работать нормально.

public ActionResult Create([Bind(Include = "PostID,Text,CategoryID")] Posts posts)
{
    if (ModelState.IsValid)
    {
        db.Posts.Add(posts);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(posts);
}
0 голосов
/ 09 января 2019

Предположим, что у вас есть две сущности Post и Category, где Category может иметь множество Posts, т. Е. Сущность Post имеет свойство CategoryId. Затем, когда вы создаете новую сущность Post для вставки / обновления, вам нужно установить CategoryId, т.е.

post.CategoryId = your_value_from_dropdown;

или вы можете получить нужную категорию по CategoryID, например,

var category = db.Category.Where(x => x.CategoryId == your_value_from_dropdown).FirstOrDefault(); 

и задайте для этой категории значение post через свойство навигации, например post.Category = category, а затем выполните вставку или обновление сообщения.

...