mvc3编辑表单中的下拉菜单

2023-12-20

这可能很简单,但我似乎无法自己解决。 我创建了一个简单的数据库和实体模式,如下所示

我正在尝试创建一个创建表单,该表单允许我添加新订单。我总共有 3 个表,所以我想要做的是拥有一个允许用户输入订单日期的表单,并且还有一个下拉列表,允许我从产品表中选择产品

我希望能够创建一个“添加”或“编辑”视图,允许我将 OrderDate 插入到 OrderTable 中,并将 OrderID 和选定的 ProductID 插入到 OrderProduct 中。

我需要在这里执行什么步骤。

我创建了一个 OrderController 并勾选了“添加操作”,然后添加了一个如下所示的创建视图

@model Test.OrderProduct

@{
    ViewBag.Title = "Create2";
}

    <h2>Create2</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>OrderProduct</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.OrderID)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.OrderID)
            @Html.ValidationMessageFor(model => model.OrderID)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.ProductID)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ProductID)
            @Html.ValidationMessageFor(model => model.ProductID)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

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

这将创建包含 OrderID 和 ProductID 文本框但不包含日期的视图。

我的控制器创建帖子尚未更改

  [HttpPost]
    public ActionResult Create(FormCollection collection)
    {
        try
        {
            var data = collection;
            // TODO: Add insert logic here
          //  db.Orders.AddObject(collection);
            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

我的问题是,

1.如何将 ProductID 文本框替换为由 Product 填充的下拉列表 2.如何从FormCollection集合中获取数据?我只想了一个 foreach 但我不知道如何获得强类型名称

对新手的任何帮助都会非常有帮助。

谢谢你!


首先,不要绑定Order实体。永远不要绑定到 EF 对象,总是尝试使用视图模型。让视图的生活变得更简单,这就是这里的目标。

所以,有一个像这样的 ViewModel:

public class CreateOrderViewModel
{
   public int OrderId { get; set; }
   public DateTime OrderDate { get; set; }
   public int SelectedProductId { get; set; }
   public IEnumerable<SelectListItem> Products { get; set; }
}

现在就是这样。

将其返回到您的视图中[HttpGet]控制器动作:

[HttpGet]
public ActionResult Create()
{
   var model = new CreateOrderViewModel
   {
      Products = db.Products
                   .ToList() // this will fire a query, basically SELECT * FROM Products
                   .Select(x => new SelectListItem
                    {
                       Text = x.ProductName,
                       Value = x.ProductId
                    });
   };

   return View(model);
}

然后渲染出产品列表:(基本 HTML 除外)

@model WebApplication.Models.CreateOrderViewModel

@Html.DropDownListFor(model => model.SelectedProductId, Model.Products)

我唯一不知道该怎么做的是绑定到日期时间字段。我猜你需要一个扩展方法(HTML Helper)来呈现日期选择器或其他东西。对于此视图(创建新订单),只需默认为DateTime.Now.

现在,到[HttpPost]控制器动作:

[HttpPost]
public ActionResult Create(CreateOrderViewModel model)
{
   try
   {
      // TODO: this manual stitching should be replaced with AutoMapper
      var newOrder = new Order
      {
         OrderDate = DateTime.Now,
         OrderProduct = new OrderProduct
         {
            ProductId = SelectedProductId
         }
      };

      db.Orders.AddObject(newOrder);
      return RedirectToAction("Index");
   }
   catch
   {
      return View();
   }
}

现在,我还认为您的 EF 模型需要改进。

对我来说(用英语来说),一个产品可以有多个订单,一个订单可以有多个产品。

所以,它应该是多对多。目前它是具有冗余连接表的 1-1。你是从数据库生成的吗?如果是这样,您的数据库可能需要工作。

您应该有一个名为的导航属性Products on the Order实体,它引用了一个集合Product,通过静默连接到多对多的连接表来实现。

这也意味着您不再拥有 DropDownList,而是 MultiSelectDropDownList。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mvc3编辑表单中的下拉菜单 的相关文章

随机推荐

  • Jekyll中如何抑制空行?

    我的博客使用 GitHub Pages 但在使用 Jekyll 时遇到了问题 我的 post html 有一个像这样的块 for testpost in site posts four lines of processing goes he
  • 每秒闪烁更新一次 BitmapImage

    我试图通过每秒设置源属性来更新图像 这有效 但更新时会导致闪烁 CurrentAlbumArt new BitmapImage CurrentAlbumArt BeginInit CurrentAlbumArt UriSource new
  • @SQL 每堂课一次

    我正在使用 spring 框架编写一些集成测试 我对不同的集成测试类有不同的 SQL 脚本 像这样的事情 ContextConfiguration classes Sql classpath sportCenter test sql pub
  • Android Nougat:TextureView 不支持显示背景可绘制对象

    我一直在我的Android应用程序中使用TextureView 并且它工作得很好 最近 我在使用 Android API 25 7 1 2 的 Android 设备上测试了我的代码 相同的代码现在不起作用并抛出错误 java lang Un
  • 使用 Asp.Net Core 强制区域设置

    我在使用 Asp Net Core 1 1 和完整的 Net Framework v4 6 2 编写的 Web 应用程序时遇到一些奇怪的问题 我想强制应用程序使用瑞典语言环境 sv SE 这在开发计算机上运行得很好 当然 但在它应该运行的服
  • 如何使用未知 CA 自签名的证书让 Android Volley 执行 HTTPS 请求?

    在提出问题之前 我找到了一些链接 我逐一检查了这些链接 但没有一个链接给我提供了解决方案 知名CA 使用 Volley 的 HTTPS 请求 https stackoverflow com questions 21555404 https
  • Testflight 上出现无效的 IPA 错误:embedded.mobileprovision 中的 APS 环境与二进制文件不匹配

    我很抱歉发布了这么多问题 但是让这个工作变得非常痛苦 尽管 Testflight 让它变得更容易 Invalid IPA error The APS environment in your embedded mobileprovision
  • 从位于 boot2docker 虚拟机内的 Docker 容器作为本地主机访问主机

    假设我有一台服务器在 OSX 上的端口 8000 上运行 我的 Docker 容器如何通过以下方式访问它localhost 8000 我也无法更改主机名 因为容器中的应用程序不在我的控制范围内 我读过之前关于使用的讨论 net host 用
  • 基于模型类型的 ember 组件

    我知道这有点重复 但我创建动态组件渲染器的所有努力都失败了 可能是由于我缺乏对 ember 概念的了解 我的场景是一个多用途搜索栏 它将搜索缓存中的模型 我希望根据模型的类型键在搜索输入下方呈现每个搜索结果 车把文件将根据模型类型和语法命名
  • 字符串到二进制文件

    我的问题是这样的 我有一个名为 Register 的课程 它有一个名为 trainName 的字符串属性及其设置器 class Register private string trainName public string getTrain
  • Excel 多行条件格式

    我试图突出显示超出预期值范围 仅较高或较低 的单元格 每行对应一个不同的行 该行有两个带有最大值和最小值的单元格 有没有办法让 Excel 计算出来 例如 第 7 行的单元格仅当其值超出 B31 的最小值或 B32 的最大值时才应突出显示
  • 角度异步事件的问题

    我的代码循环遍历数组中的 10 个项目 对每个项目发出请求 然后将返回的数据推送到数组中 一切都运行良好 直到 q all line details getDetails function idSet pageNum var page id
  • python 2.7小写

    当我使用 lower 在Python 2 7中 字符串不会将字母转换为小写 我从字典中读取数据 我尝试使用str tt code lower tt code lower 有什么建议 使用 unicode 字符串 drostie signy
  • 如何通过 Python 使用 GeckoDriver 和 Selenium 启动使用默认 Firefox 到 68.9.0esr 的 Tor 浏览器 9.5

    我正在尝试通过以下方式启动 Tor 浏览会话托尔浏览器 9 5它使用默认的火狐浏览器 v68 9 0esr using Gecko驱动程序 https stackoverflow com questions 43660195 why fir
  • 什么时候应该将translatesAutoresizingMaskIntoConstraints设置为true?

    我读过文档 https developer apple com documentation uikit uiview 1622572 translatesautoresizingmaskintoco 但我仍然不确定什么时候不需要将其设置为f
  • 获取SD卡路径

    请在投反对票和 或将其标记为重复之前阅读整篇文章 我正在开发一款应用程序 它可以从用户手机上的特定文件夹中读取文件 从 SD 卡 如果有的话 或从内置存储中读取 是的 清单中提到了 READ EXTERNAL STORAGE 我还在处理 A
  • android(单点触控)绘图应用程序撤消方法无法正常工作

    我正在开发一个绘图应用程序 但面临一些撤消问题 编码如下 public class DoodleView extends View Context context new private static final float TOUCH T
  • 有没有办法使用 ODI 场景重新创建 ODI 包?

    我错误地从我的项目中删除了一个非常大的 ODI 包 如果我之前为同一项目导出过场景 是否可以重新创建相同的包 不幸的是 没有任何方法可以直接从场景中生成已删除的包 您可以将其视为包的编译版本 以下是一些需要检查的事项 以确定您是否可以检索某
  • 该进程无法访问文件“ ”,因为该文件正在被另一个进程使用

    我正在尝试删除使用文件对话框上传的图像文件的本地副本 在计算机上 它抛出进程无法访问文件 C Documents and Settings 用户名 我的文档 我的图片 1220 bmp 因为它正在被另一个进程使用 private void
  • mvc3编辑表单中的下拉菜单

    这可能很简单 但我似乎无法自己解决 我创建了一个简单的数据库和实体模式 如下所示 我正在尝试创建一个创建表单 该表单允许我添加新订单 我总共有 3 个表 所以我想要做的是拥有一个允许用户输入订单日期的表单 并且还有一个下拉列表 允许我从产品