Значение DropDownList вставляется в базу данных как внешний ключ

Я пытаюсь вставить 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*/ //

}

person JNeves    schedule 09.01.2019    source источник
comment
Это потому, что это «Вставка», она просто вставляется. У вас нет проверок против него. Если вы хотите обновить значения, вы можете обновить   -  person JamesS    schedule 09.01.2019


Ответы (2)


Сначала напишите свой класс модели 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);
}
person TanvirArjel    schedule 10.01.2019
comment
Не работает, я получил null в идентификаторе категории в сообщениях таблицы. - person JNeves; 10.01.2019
comment
Вы публикуете один или несколько постов из поля зрения? - person TanvirArjel; 10.01.2019
comment
Большой! Поделитесь своим кодом просмотра Razor (форма создания сообщения) с вопросом! Это поможет выявить проблему! - person TanvirArjel; 10.01.2019
comment
Ответ заключался в том, что мне нужен запрос linq, чтобы получить объект из идентификатора, чтобы связать это значение с posts.Category, но я недостаточно хорошо разбираюсь в linq, и сущность требует этих знаний. - person JNeves; 10.01.2019
comment
Я видел решение! Но это не хорошо! путь! Вам чего-то не хватает! Вы должны передать его из поля зрения! Вам не нужно обращаться к базе данных каждый раз для этого! - person TanvirArjel; 10.01.2019
comment
Я хотел добавить ваш код просмотра? но ты этого не сделал! тогда как разберутся в вашей проблеме! - person TanvirArjel; 10.01.2019
comment
Уже отредактировано с моим кодом просмотра. Извините, я не понял, что это был плохой способ сделать что-то - person JNeves; 10.01.2019
comment
Спасибо! Теперь ваш Posts posts в методе создания сообщения не содержит какое-либо значение для CategoryID при отправке формы? - person TanvirArjel; 10.01.2019
comment
Да, значение по умолчанию равно null - person JNeves; 10.01.2019
comment
Давайте продолжим обсуждение в чате. - person TanvirArjel; 10.01.2019
comment
@JNeves, пожалуйста, проверьте чат! - person TanvirArjel; 10.01.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, а затем сделайте вставку или обновление для сообщения.

person Max    schedule 09.01.2019