为什么这种在 ASP.NET Core 7 MVC 中添加动态行的方法似乎在我的 Razor 视图中返回 JSON?

Why does this approach for adding dynamic rows in ASP.NET Core 7 MVC appear to be returning JSON in my Razor view?

提问人:JLudt 提问时间:11/13/2023 最后编辑:marc_sJLudt 更新时间:11/13/2023 访问量:65

问:

我正在尝试让几个不同的文本框动态输出。遵循此处找到的 ASP.NET Core 7 MVC 中动态添加行的模式,我能够将其实现到一个小型基本项目中,并且感觉我很好地掌握了他动态添加行的方法。

但是,我在尝试将相同的方法放入使用视图模型和 DTO 的大型项目(也是 .NET 7)时遇到了麻烦。我目前的努力只是产生了看起来像 DTO 的 JSON。

关于我做错了什么,或者我在尝试将这种方法实施到更复杂的项目中时是否遗漏了其他东西,有什么想法吗?最终,我试图使用尽可能少的 Javascript 为一个相当直接的排序系统创建动态行。我见过的大多数方法都只显示使用基本模型。

我的一些代码如下:

Razor 视图中显示的当前输出如下所示:

PurchaseOrderLineItemDto { PurchaseOrderLineItemId = 0, LineItemNumber = 0, LineItemDescription = , LineItemQuantity = 0, LineItemUnitPrice = 0, LineItemExtPrice = 0 }

视图

@model MvcApplication.ViewModels.PurchaseOrders.PurchaseOrderCreateViewModel
@{
    ViewData["Title"] = "Create new Order";
}

      <div class="row">
        <div class="container pt-4 table-responsesive text-nowrap" id="orderItemsContainer">
          <table class="table table-borderless" id="tblPurchaseOrderLineItems">
                        <thead>
                            @foreach (var orderLineItem in Model.PurchaseOrderLineItems)
                            {
                            <th>
                                @Html.DisplayNameFor(model => orderLineItem.LineItemDescription)
                            </th>
                            <th>
                                @Html.DisplayNameFor(model => orderLineItem.LineItemQuantity)
                            </th>
                            <th>
                                @Html.DisplayNameFor(model => orderLineItem.LineItemUnitPrice)
                            </th>
                            <th>
                                @Html.DisplayNameFor(model => orderLineItem.LineItemExtPrice)
                            </th>
                            }
                        </thead>
                        <tbody>
                            @Html.EditorFor(model => model.PurchaseOrderLineItems)
                        </tbody>
            
          </table>

查看模型类:

namespace MvcApplication.ViewModels.PurchaseOrders
{
    public record PurchaseOrderCreateViewModel
    {
        [DefaultValue(null)]
        public List<PurchaseOrderLineItemDto> PurchaseOrderLineItems { get; set; }

        public PurchaseOrderCreateViewModel()
        {
            PurchaseOrderLineItems = new List<PurchaseOrderLineItemDto>();
        }
    }
}

编辑器模板

@model MvcApplication.ViewModels.PurchaseOrders.PurchaseOrderCreateViewModel
<tr>
    <td class="col-8">
        @Html.TextBoxFor(m => m.PurchaseOrderLineItems, new {style="width: 100%", @class="form-control rounded-0", @type="text"})
    </td>
    <td>
    <td class="d-flex" style="width:20%;">
        <button class="btnDeleteLineItemRow btn btn-danger rounded-0 flex-fill" id="deleteLineItemRow"><i class="fa fa-trash"></i></button>
    </td>
</tr>

查看(由控制器方法调用以添加新行)EditorTemplate

@model MvcApplication.ViewModels.PurchaseOrders.PurchaseOrderCreateViewModel
@Html.EditorFor(model => model.PurchaseOrderLineItems)

添加新行项的控制器方法:

[HttpPost]
[Route("AddOrderItem")]
public async Task<ActionResult> AddOrderItem([Bind("PurchaseOrderLineItems")] PurchaseOrderCreateViewModel purchaseOrderCreateViewModel)
{
    purchaseOrderCreateViewModel.PurchaseOrderLineItems.Add(new PurchaseOrderLineItemDto());
    return PartialView("PurchaseOrderLineItems", purchaseOrderCreateViewModel);
}
C# ASP.NET-核心-MVC .NET-7.0

评论

0赞 Ronaldoz 11/14/2023
数字的值是否通过失败?我用你的代码进行了测试,值被传递到html中的模板视图,你能分享更完整的代码吗?
0赞 Ronaldoz 11/15/2023
此类问题可能由不同的原因引起,因为它发生在大型复杂项目中。考虑到您直接显示 listitem 并且仍然获取模型值,您可以共享一些错误消息(如果有),并且示例代码中是否进行了任何其他更改?
0赞 JLudt 11/16/2023
嗨,感谢您的回复。我没有机会传递任何值,因为我没有得到 EditorTemplate 中指定的任何文本框。当我单击视图中的按钮进行添加时,它会调用 AddOrderItem 的方法,该方法调用分部视图,然后只用文本填充页面,这是我在第一个代码示例中指定的。我也没有收到任何错误。我已经包含了使此 EditorTemplate 工作所需的几乎所有代码,您想看到一些特定的东西吗?
0赞 Ronaldoz 11/16/2023
嗨,@JLudt,使用 @Html.TextBoxFor(m => m.PurchaseOrderLineItems) 不应按预期工作,因为它是一个列表,无法正确传递。请检查您的代码在简单项目中是否正常工作,是否与大型项目中的代码相同。

答: 暂无答案