下载mvc3编辑表单

Div*_*Dan 15 c# html-helper razor asp.net-mvc-3

这可能很简单,但我似乎无法自己解决.我创建了一个简单的数据库和实体模式,看起来像这样

在此输入图像描述

我正在尝试创建一个允许我添加新订单的创建表单.我总共有3个表,所以我想要的是允许此人输入订单日期的表单,还有一个下拉列表,允许我从产品表中选择一个产品

我希望能够创建一个Add或Edit视图,允许我将OrderDate插入OrderTable,并将OrderID和选定的ProductID插入OrderProduct.

我需要在这做什么步骤.

我创建了一个OrderController并勾选了"添加操作",然后添加了一个看起来像这样的Create View

@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>
Run Code Online (Sandbox Code Playgroud)

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

我的控制器CreatePost还没有改变

  [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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是,

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

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

谢谢!

RPM*_*984 25

首先,不要绑定Order实体.永远不要绑定到EF对象,总是尝试使用ViewModel.使View的生活更简单,这就是目标.

所以,有一个像这样的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; }
}
Run Code Online (Sandbox Code Playgroud)

就是这样.

将其返回到[HttpGet]控制器操作中的View :

[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);
}
Run Code Online (Sandbox Code Playgroud)

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

@model WebApplication.Models.CreateOrderViewModel

@Html.DropDownListFor(model => model.SelectedProductId, Model.Products)
Run Code Online (Sandbox Code Playgroud)

我唯一不知道该怎么做的是绑定到DateTime字段.我猜你需要一个扩展方法(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();
   }
}
Run Code Online (Sandbox Code Playgroud)

现在,我也认为你的EF模型需要工作.

对我来说(用英语表示),产品可以有很多订单,订单可以有很多产品.

所以,它应该是多对多的.目前,这是一个带有冗余连接表的1-1.你是从DB生成的吗?如果是这样,您的DB可能需要工作.

您应该在Order实体上有一个名为Products的导航属性,该属性引用Product的集合,通过静默连接可以实现多对多中的连接表.

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