如何获取局部视图以将相关对象传递给 .NET MVC 中的 post 方法?

How do I get a partial view to pass related objects to post method in .NET MVC?

我在模态中有一个局部视图,它采用这样的视图模型:

public class AssetOtherEventViewModel
{
    public DateTime Date { get; set; } = DateTime.UtcNow;

    public Asset Asset { get; set; }

    public ICollection<AssetEvent> OtherEvents { get; set; }
}

这是观点:

@model XXXXXXX.ViewModels.AssetOtherEventViewModel
@using (Html.BeginForm("SaveOtherEvents", "AssetEvent", null))
{
    <div class="form-horizontal">
        @Html.HiddenFor(model => model.Asset)
        @Html.HiddenFor(model => model.Date)

        @foreach (GrindrodDataCapture.Models.AssetEvent assetEvent in Model.OtherEvents)
        {
            <div class="form-group">
                @Html.Label(assetEvent.EventType.Name)
                <div class="col-md-10">
                    @Html.EditorFor(modelItem => assetEvent.Hours, new { htmlAttributes = new { @class = "form-control", required = "required" } })
                    @Html.ValidationMessageFor(model => assetEvent.Hours, "", new { @class = "text-danger" })
                </div>
            </div>
        }
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-primary" />
            </div>
        </div>
    </div>
}

当我使用 public ActionResult SaveOtherEvents(AssetOtherEventViewModel vm) 方法时,AssetOtherEvents 属性为空。

有谁知道如何更好地处理或解决这个问题?

您可以使用 BeginCollectionItem 在 post 上接收复杂模型 在你的主页上 做这样的事情

<fieldset>
        <legend>Order Items</legend>
        <div data-demo-ajax="list-order-items">
            @Html.EditorFor(x => x.Items)
        </div>
        <p>
            <a href="#" data-demo-ajax="add-order-item" data-demo-ajax-url="@Url.Action(MVC.Demo.OrderItem())">Add Order Item</a>
        </p>
    </fieldset>

对于 child collection 项

@using (Html.BeginCollectionItem("Items"))
{
    //Your child element
}

如果您从项目页面搜索开始collection项目,您可能会找到很多示例,例如here

我通过索引我需要的对象属性解决了这个问题。他们通过这种方式到达 post 控制器。

@model XXXXXXXX.ViewModels.AssetOtherEventViewModel
@using (Html.BeginForm("SaveOtherEvents", "AssetEvent", null))
{
<div class="form-horizontal">
    @Html.HiddenFor(model => model.AssetID)
    @Html.HiddenFor(model => model.Date)
    <fieldset>

        <div id="EditorRows">
            @for (var i = 0; i < Model.OtherEvents.Count; i++)
            {

            <div class="form-group">
                @Html.Label(Model.OtherEvents[i].EventType.Name, new { @class = "control-label col-md-4" })
                <div class="col-md-8">
                    @Html.EditorFor(m => Model.OtherEvents[i].Hours, new { htmlAttributes = new { @class = "form-control" } })
                </div>
            </div>


                @Html.HiddenFor(m => Model.OtherEvents[i].EventType_ID)
                @Html.HiddenFor(m => Model.OtherEvents[i].ID)

            }
        </div>
    </fieldset>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-primary" />
            </div>
        </div>
</div>
    }