我有我的模型的模型属性。该属性是在创建时在控制器内部设置的,但是提交后我无法获取该值
public class Item
{
public Vendor mVendor { get; set; }
}
我们有一个带有供应商的此类Item。供应商是其自己的模型,可以从供应商控制器访问项目创建界面。
public ActionResult Create(int? vendorID)
{
if (vendorID != null)
{
Item item = new Item { mVendor = db.Vendors.Find(vendorID) };
return View(item);
}
}
现在这是提交代码
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Item item)
{
if (ModelState.IsValid)
{
db.Items.Add(item);
db.SaveChanges();
return RedirectToAction("Index");
}
}
到提交代码时,它表示供应商为空。我试图在视图中放置一个HiddenFor,但这似乎无法解决任何问题。有人有建议吗?
编辑: 视图代码:
@model Models.Item
@{
ViewBag.Title = "Create";
}
<h2>Item Sheet</h2>
<p><font color="red">@ViewBag.Error</font></p>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Item Data (@Html.DisplayFor(model => model.Vendor.name))</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
<p>Item Number:</p>
<div class="col-md-10">
@Html.EditorFor(model => model.PartNo, new { htmlAttributes = new { @class = "form-control", @id = "PartNumber" } })
@Html.ValidationMessageFor(model => model.PartNo, "", new { @class = "text-danger", @Value = ""})
</div>
</div>
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
答案 0 :(得分:0)
您需要使用@Html.HiddenFor(m => m.mVendor.Id)
之类的模型,因为您正在模型中使用模型。
我也不建议在模型中使用模型,除非您在视图中需要其他数据。
答案 1 :(得分:0)
如果您的使用实体框架和数据表具有关联,则可以使用 紧急加载 来加载项目列表中每个项目的供应商数据。下面以数据模型为例
public class Vendor_Details
{
public Vendor_Details()
{
Items = new HashSet<Items_List>();
}
public int Id { get; set; }
public string Vendor_Name { get; set; }
public string Vendor_Code { get; set; }
public string Vendor_Email { get; set; }
public ICollection<Items_List> Items { get; set; }
}
public class Items_List
{
public int Id { get; set; }
public string Item_Name { get; set; }
public string Description { get; set; }
public decimal Item_Price { get; set; }
public int Vendor_Id { get; set; }
[ForeignKey("Vendor_Id")]
public Vendor_Details Vendor { get; set; }
}
下面是加载数据的示例Ef查询
var itemList = databaseContext.Items_List.Include("Vendor").ToList();
这样,您可以同时加载供应商及其项目,然后进行缓存以提高应用程序性能并减少数据库往返。