模型内的模型返回为null

时间:2019-08-01 18:56:00

标签: c# asp.net-mvc razor

我有我的模型的模型属性。该属性是在创建时在控制器内部设置的,但是提交后我无法获取该值

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")
}

2 个答案:

答案 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();

这样,您可以同时加载供应商及其项目,然后进行缓存以提高应用程序性能并减少数据库往返。