如何使用View中的下拉列表将数据从ViewModel插入数据库 [英] How to insert data from ViewModel to Database with using dropdown list in View

查看:91
本文介绍了如何使用View中的下拉列表将数据从ViewModel插入数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个使用下拉列表为数据库创建记录的概念,该列表已经包含来自同一数据库但来自其他表的数据.

I have the concept to create a record for the database using a drop-down list, already containing data from the same database but from other tables.

我的部分数据库如下:

在Visual Studio中,我使用了自动表支架,我创建了ModelView来跳过使用Id的过程. ID是自动生成的,因此无需使用ID即可更改ID号.下面是模型:

In Visual Studio I used automatic table scaffolding, I created ModelView to skip using Id. The id is generated automatically, hence there is no need to use the Id to change the ID number. Below are the models:

ModelView使用一个下拉列表,并且将从下拉列表中选择的项与用户输入的基本数据一起传输到数据库中.

The ModelView uses a drop-down list and selected items from the drop-down lists are to be transferred to the database along with the basic data entered by the user.

程序代码尝试:

控制器

public IActionResult Create()
{
    ObjectViewModel model = new ObjectViewModel();

    foreach (var object in _context.ObjectA)
    {
        model.ObjectA.Add(new SelectListItem { Text = object.A, Value = object.IdA });
    }

    foreach (var hear in _context.ObjectB)
    {
        model.ObjectB.Add(new SelectListItem { Text = object.B, Value = object.IdB });
    }

    foreach (var object in _context.ObjectC)
    {
        model.ObjectC.Add(new SelectListItem { Text = object.C, Value = object.IdC });
    }

    return View(model);
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(string IdA, string IdB, string IdC)
{
    ObjectViewModel model = new ObjectViewModel();
    ObjectABC abc = new ObjectABC();

    if (ModelState.IsValid)
    {
        foreach (var object in _context.ObjectA)
        {
            model.ObjectA.Add(new SelectListItem { Text = object.A, Value = object.IdA });
        }

        if (IdA != string.Empty)
        {
            var objectsA = (from a in _context.ObjectABC
                            where a.IdA == IdA
                            select a).ToList();

            if (IdB != string.Empty)
            {
                var objectsB = (from b in _context.ObjectABC
                                where b.IdB == IdB
                                select b).ToList();

                foreach (var object in _context.ObjectB)
                {
                    model.ObjectB.Add(new SelectListItem { Text = object.B, Value = object.IdB });
                }

                if (IdC != string.Empty)
                {
                    var objectsC = (from c in _context.ObjectABC
                                    where c.IdC == IdC
                                    select c).ToList();

                    foreach (var object in _context.ObjectC)
                    {
                        model.ObjectC.Add(new SelectListItem { Text = object.C, Value = object.IdC });
                    }
                }
            }
        }

        _context.Add(abc);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }
    return View(model);
}

查看

<form asp-action="Create">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <div class="form-gr">
        <label asp-for="ObjectA" class="control-label"></label>
        <select asp-for="IdA" class="select-style" asp-items="Model.objectsA">
            <option value = "" > --Select option--</option>
        </select>
    </div>
    <div class="form-gr">
        <label asp-for="ObjectB" class="control-label"></label>
        <select asp-for="IdB" class="select-style" asp-items="Model.objectsB">
            <option value = "" > --Select option--</option>
        </select>
    </div>
    <div class="form-gr">
        <label asp-for="ObjectC" class="control-label"></label>
        <select asp-for="IdC" class="select-style" asp-items="Model.objectsC">
            <option value = "" > --Select option--</option>
        </select>
    </div>
    <div class="form-gr">
        <label asp-for="Price" class="control-label"></label>
        <input asp-for="Price" class="form-control" />
        <span asp-validation-for="Price" class="text-danger"></span>
    </div>
    <div class="form-gr">
        <input type = "submit" value="Create" class="btn btn-primary" />
    </div>
</form>

但是它不起作用.有什么想法吗?

But it not working.. Any ideas ?

推荐答案

您不必填写ObjectABC的属性,您可以像这样发布创建操作

You don't fill propertys of ObjectABC, you can post action of create like this

 [HttpPost]
 [ValidateAntiForgeryToken]
 public async Task<IActionResult> Create(string IdA, string IdB, string IdC)
 {
       ObjectABC abc = new ObjectABC();

       if (ModelState.IsValid)
       {
          if (IdA != string.Empty && IdB != string.Empty && IdC != string.Empty)
                {
                    abc.IdA = IdA;
                    abc.IdB = IdB;
                    abc.IdC = IdC;
                    _context.Add(abc);
                    await _context.SaveChangesAsync();
                    return RedirectToAction(nameof(Index));
                }                
        }

        ObjectViewModel model = new ObjectViewModel();

        foreach (var object in _context.ObjectA)
                model.ObjectA.Add(new SelectListItem { Text = object.A, Value =object.IdA });          

        foreach (var hear in _context.ObjectB)
                model.ObjectB.Add(new SelectListItem { Text = object.B, Value = object.IdB }); 

        foreach (var object in _context.ObjectC)
                model.ObjectC.Add(new SelectListItem { Text = object.C, Value = object.IdC });

        model.IdA = IdA;
        model.IdB = IdB;
        model.IdC = IdC;

        return View(model);
}

这篇关于如何使用View中的下拉列表将数据从ViewModel插入数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆