【问题标题】:Binding child virtual class data to view in ASP.NET MVC for Entity Framework Core绑定子虚拟类数据以在 ASP.NET MVC for Entity Framework Core 中查看
【发布时间】:2021-07-03 09:52:21
【问题描述】:

所以我在将类数据出价到 ASP.NET MVC 视图时遇到了一些问题(顺便说一句,我是 ASP.NET MVC 的新手)。

通常这不会有问题,因为我可以稍后获取数据或执行某些操作,但问题出在我的控制器类中,它验证数据返回 false 并破坏函数。

我可以删除验证器,但不幸的是它是必需的,我没有时间重写它。

我离题了...我的问题是如何在视图上绑定数据并将其正确发送到控制器?

这是模型类:

public partial class Product
{
    public int Id { get; set; }
    public string Code { get; set; }
    public string Description { get; set; }
    public int CatalogId { get; set; }

    public virtual Catalog Catalog { get; set; } //<-- This is where my Problem is
}

这是模型-视图绑定的控制器方法:

 public ActionResult Update(int? id)
    {
        if(id != null)
        {
            var productManager = new ProductManager();
            var model = productManager.GetProductByID(id.Value);
            return View(model);
        }
        return RedirectToAction("Index");
    }

这是视图:

@if (Model != null)
{
    using (Html.BeginForm("Update", "Product", FormMethod.Post))
    {
        <tr>
            <td>Id</td>
            <td>@Html.TextBoxFor(model => model.Id, new { @Value = Model.Id })</td>
            <td>@Html.ValidationMessageFor(model => model.Id)</td>
        </tr>
        <tr>
            <td>Code</td>
            <td>@Html.TextBoxFor(model => model.Code, new { @Value = Model.Code })</td>
            <td>@Html.ValidationMessageFor(model => model.Code)</td>
        </tr>
        <tr>
            <td>Description</td>
            <td>@Html.TextBoxFor(model => model.Description, new { @Value = Model.Description })</td>
            <td>@Html.ValidationMessageFor(model => model.Description)</td>
        </tr>
        <tr>
            <td>@Html.HiddenFor(model => model.CatalogId, new { @Value = Model.CatalogId })</td>
            <td>@Html.HiddenFor(model => model.Catalog, new { @Value = Model.Catalog })</td>
            <td>@Html.HiddenFor(model => model.Catalog.Id, new { @Value = Model.Catalog.Id })</td>
            <td>@Html.HiddenFor(model => model.Catalog.Code, new { @Value = Model.Catalog.Code })</td>
            <td>@Html.HiddenFor(model => model.Catalog.Description, new { @Value = Model.Catalog.Description })</td>
            <td>@Html.HiddenFor(model => model.Catalog.Product, new { @Value = Model.Catalog.Product })</td>
        </tr>
        <tr>
            <td><button type="submit">Update</button></td>
        </tr>
    }
}

这是更新产品的控制器方法:

[HttpPost]
[ActionName("Update")]
public ActionResult Update(EURIS.Entities.Product product)
{
    if (ModelState.IsValid) //<-- Product.Catalog is null and IsValid return false
    {  
        ProductManager productManager = new ProductManager();
        productManager.UpdateProduct(product);
    }

    return RedirectToAction("Index");
}

【问题讨论】:

    标签: c# asp.net-mvc entity-framework .net-core entity-framework-core


    【解决方案1】:

    您需要将目录的属性(可能还有目录 ID)添加到您的视图中,可能作为一个隐藏字段,以确保它往返于服务器并在您的模型中填充控制器在更新上执行。

    @Html.HiddenFor(model => model.CatalogId, new { @Value = ViewBag.CatalogId }
    @Html.HiddenFor(model => model.Catalog.Id, new { @Value = ViewBag.Catalog.Code }
    @Html.HiddenFor(model => model.Catalog.Title, new { @Value = ViewBag.Catalog.Title } 
    

    Catalog 属性是一个复杂的对象,MVC 不能通过这种方式将其单独呈现到视图中。在这种情况下,我将所需的属性放入隐藏字段中,以便它们在控制器的编辑/更新操作中可用。

    【讨论】:

    • 您好,谢谢。但问题仍然存在。当它返回到服务器时,目录属性仍然为空。
    【解决方案2】:

    你不需要任何 ViewBag,所以改变你的行动:

    
    var model=context.Set<Product>().FirstOrDefault(i=> I.Id==id);
    return View(model);
    
    

    由于您不需要任何 ViewBag,请从视图中删除所有 ViewBag 代码。例如应该是

    @if (Model != null)
    {
    <td>@Html.TextBoxFor(model => model.Id)</td>
    .....
     <td>@Html.TextBoxFor(model => model.Code)</td>
    
    ....and so on
    

    目录是一个虚拟或导航属性。您不需要整个 Catalog 实例来保存 Product,您可以只使用隐藏的 CatalogId:

    @Html.HiddenFor(model => model.CatalogId);
    

    更新

    可以包含目录内容

    var model=context.Set<Product>().Include(c=> c.Catalog).FirstOrDefault(i=> I.Id==id);
    

    但我在您的视图中看不到 Catalog 的任何用途。如果您需要同时进行一些目录更改,请更新您的帖子。

    【讨论】:

    • 您好,谢谢。一个很好的建议,我确实编辑了代码。但不幸的是,这并不能解决我的问题。目录复杂属性在更新时仍然为空。
    • 您需要目录属性做什么?你需要做一些改变吗?我可以填充它,但我没有看到任何用处。
    • 你说得对,睡了一夜好觉后,我发现我在项目一开始就犯了一个很大的错误。简而言之......我正在尝试在目录和产品之间建立多对多的关系。我需要从头开始重写所有内容。无论如何,谢谢你的时间:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 2017-05-16
    • 2012-03-09
    • 2019-02-23
    • 2018-09-27
    相关资源
    最近更新 更多