asp.net - 如何使用 View 中的下拉列表将数据从 ViewModel 插入到数据库

标签 asp.net asp.net-mvc asp.net-core

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

我的部分数据库如下所示:

enter image description here

在 Visual Studio 中,我使用了自动表脚手架,我创建了 ModelView 以跳过使用 Id。 id 是自动生成的,因此不需要使用 Id 来更改 ID 号。以下是模型:

enter image description here

ModelView 使用下拉列表,下拉列表中的选定项将与用户输入的基本数据一起传输到数据库。

程序代码尝试:

Controller

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>

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

最佳答案

你不填写ObjectABC的属性,你可以像这样发布创建 Action

 [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);
}

关于asp.net - 如何使用 View 中的下拉列表将数据从 ViewModel 插入到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58738852/

相关文章:

asp.net - 如何通过 HTTP 和 HTTPS 协议(protocol)发送 xml 文件并取回结果

c# - 如何从下拉列表中获取选定的值

c# - 如何在没有 http 请求的情况下在 MVC 核心应用程序中启动 HostedService

c# - 如何创建包含其他标签助手的自定义标签助手

c# - 反序列化错误 - 值不能为空/未定义无参数构造函数

c# - 尝试将 javascript 数组和 int 传递给代码隐藏

javascript - 通过 ajax 显示评论的完整或简短文本

asp.net-mvc - MVC6 自托管 wwwroot 内容返回 404,IIS Express 不会

javascript - ASP.NET WebForms 路由 Javascript 错误

asp.net-mvc - ASP.net MVC : Where to keep application data?