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.
归档时间: |
|
查看次数: |
23648 次 |
最近记录: |