如何获取局部视图以将相关对象传递给 .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)
方法时,Asset
和 OtherEvents
属性为空。
有谁知道如何更好地处理或解决这个问题?
您可以使用 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>
}
我在模态中有一个局部视图,它采用这样的视图模型:
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)
方法时,Asset
和 OtherEvents
属性为空。
有谁知道如何更好地处理或解决这个问题?
您可以使用 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>
}