.Net MVC 编辑器模板不在回发时返回数据
.Net MVC editor template is not returning data on postback
我有一个要求,需要显示动态复选框列表(来自数据库的数据)。我有一个复选框的视图模型。
public class AmenitiesListViewModel
{
public int AmenityId { get; set; }
public string Title { get; set; }
public bool Checked { get; set; }
public string ImageSrc { get; set; }
}
具有该视图模型的 ICollection 对象的另一个视图模型。
public class HouseAmenityViewModel
{
public HouseAmenityViewModel()
{
Amenities = new HashSet<AmenitiesListViewModel>();
}
[HiddenInput]
public Guid HouseId { get; set; }
public ICollection<AmenitiesListViewModel> Amenities { get; set; }
}
然后,我创建了一个服务来从数据库中准备复选框列表。
var amenities = await _amenityRepository.ListAmenitiesAsync();
if (amenities != null)
{
model.HouseId = houseId;
foreach (var amenity in amenities)
{
model.Amenities.Add(new AmenitiesListViewModel
{
AmenityId = amenity.AmenityId,
Title = amenity.Description,
Checked = false,
ImageSrc = string.Format(_imageOptions.AmenityImagePath, amenity.ImageFileName)
});
}
}
在我看来,我正在使用 @Html.EditorFor
呈现复选框列表。
<form asp-action="UpdateHouseAmenity" asp-controller="Admin" method="post" id="update-amenity-form" class="amenity-form">
<input asp-for="HouseId" />
<div class="row"><div class="col-md-12">@Html.EditorFor(m => m.Amenities)</div></div>
<div class="row">
<div class="col-md-12 mt-10">
<button type="submit" class="btn btn-primary" id="update-amenity-button">Submit</button>
<button type="button" class="btn btn-danger">Reset</button>
</div>
</div>
</form>
编辑器模板如下所示:
@model HouseRentalManagement.Models.AdminViewModels.AmenitiesListViewModel
<div class="container mt-10" style="width: 30%;
display: inline-block;
float: left;">
<label>
<img src="@Model.ImageSrc" style="height: 30px; width: 30px;" />
<input type="checkbox" @string.Format("{0}", Model.Checked ? "checked" : "") /> @Model.Title
</label>
</div>
我在视图中正确显示了复选框列表。我的表单正在提交给指定的操作。
问题是:当我提交时,我没有从 @Html.EditorFor(m => m.Amenities)
集合中得到任何东西。
控制器:
public async Task<IActionResult> UpdateHouseAmenity(HouseAmenityViewModel model)
{
var result = await _houseService.UpdateHouseAmenitiesAsync(model);
}
这里要注意的一件事是这个视图是在页面加载后使用 Ajax 呈现的。
Ajax:
var loadAmenity = function () {
$.ajax({
url: "/Admin/GetHouseAmenities"
}).done(function (data) {
$('#amenity-info').html(data);
}).fail(function (a, textError) {
console.error(textError);
});
};
控制器:
var model = await _houseService.GetHouseAmenityViewModelAsync(new Guid());
return PartialView("~/Views/Admin/_HouseAmenityPartial.cshtml", model);
您当前的编辑器模板代码将为 Amenities
集合
中的每个项目生成如下所示的 HTML 标记
<label>
<img src="SomeImageSourceValue" style="height: 30px; width: 30px;">
<input type="checkbox"> AminityTitle
</label>
复选框没有name
属性值!要使模型绑定起作用,表单元素 name
属性值应与 class 的 属性 名称相匹配( 用作 HttpPost 操作方法参数的名称)。所以理想情况下我们需要它像这样生成
<input type="checkbox" name="Amenities[0].Checked" value="true">
<input type="checkbox" name="Amenities[1].Checked" value="true">
<input type="checkbox" name="Amenities[2].Checked" value="true">
好消息是,如果您正确使用输入标签助手,它会为您生成正确的标记。
@model HouseRentalManagement.Models.AdminViewModels.AmenitiesListViewModel
<div class="container mt-10" >
<img src="@Model.ImageSrc" style="height: 30px; width: 30px;" />
<input type="checkbox" asp-for="Checked" /> @Model.Title
<input type="hidden" asp-for="AmenityId" />
</div>
我有一个要求,需要显示动态复选框列表(来自数据库的数据)。我有一个复选框的视图模型。
public class AmenitiesListViewModel
{
public int AmenityId { get; set; }
public string Title { get; set; }
public bool Checked { get; set; }
public string ImageSrc { get; set; }
}
具有该视图模型的 ICollection 对象的另一个视图模型。
public class HouseAmenityViewModel
{
public HouseAmenityViewModel()
{
Amenities = new HashSet<AmenitiesListViewModel>();
}
[HiddenInput]
public Guid HouseId { get; set; }
public ICollection<AmenitiesListViewModel> Amenities { get; set; }
}
然后,我创建了一个服务来从数据库中准备复选框列表。
var amenities = await _amenityRepository.ListAmenitiesAsync();
if (amenities != null)
{
model.HouseId = houseId;
foreach (var amenity in amenities)
{
model.Amenities.Add(new AmenitiesListViewModel
{
AmenityId = amenity.AmenityId,
Title = amenity.Description,
Checked = false,
ImageSrc = string.Format(_imageOptions.AmenityImagePath, amenity.ImageFileName)
});
}
}
在我看来,我正在使用 @Html.EditorFor
呈现复选框列表。
<form asp-action="UpdateHouseAmenity" asp-controller="Admin" method="post" id="update-amenity-form" class="amenity-form">
<input asp-for="HouseId" />
<div class="row"><div class="col-md-12">@Html.EditorFor(m => m.Amenities)</div></div>
<div class="row">
<div class="col-md-12 mt-10">
<button type="submit" class="btn btn-primary" id="update-amenity-button">Submit</button>
<button type="button" class="btn btn-danger">Reset</button>
</div>
</div>
</form>
编辑器模板如下所示:
@model HouseRentalManagement.Models.AdminViewModels.AmenitiesListViewModel
<div class="container mt-10" style="width: 30%;
display: inline-block;
float: left;">
<label>
<img src="@Model.ImageSrc" style="height: 30px; width: 30px;" />
<input type="checkbox" @string.Format("{0}", Model.Checked ? "checked" : "") /> @Model.Title
</label>
</div>
我在视图中正确显示了复选框列表。我的表单正在提交给指定的操作。
问题是:当我提交时,我没有从 @Html.EditorFor(m => m.Amenities)
集合中得到任何东西。
控制器:
public async Task<IActionResult> UpdateHouseAmenity(HouseAmenityViewModel model)
{
var result = await _houseService.UpdateHouseAmenitiesAsync(model);
}
这里要注意的一件事是这个视图是在页面加载后使用 Ajax 呈现的。 Ajax:
var loadAmenity = function () {
$.ajax({
url: "/Admin/GetHouseAmenities"
}).done(function (data) {
$('#amenity-info').html(data);
}).fail(function (a, textError) {
console.error(textError);
});
};
控制器:
var model = await _houseService.GetHouseAmenityViewModelAsync(new Guid());
return PartialView("~/Views/Admin/_HouseAmenityPartial.cshtml", model);
您当前的编辑器模板代码将为 Amenities
集合
<label>
<img src="SomeImageSourceValue" style="height: 30px; width: 30px;">
<input type="checkbox"> AminityTitle
</label>
复选框没有name
属性值!要使模型绑定起作用,表单元素 name
属性值应与 class 的 属性 名称相匹配( 用作 HttpPost 操作方法参数的名称)。所以理想情况下我们需要它像这样生成
<input type="checkbox" name="Amenities[0].Checked" value="true">
<input type="checkbox" name="Amenities[1].Checked" value="true">
<input type="checkbox" name="Amenities[2].Checked" value="true">
好消息是,如果您正确使用输入标签助手,它会为您生成正确的标记。
@model HouseRentalManagement.Models.AdminViewModels.AmenitiesListViewModel
<div class="container mt-10" >
<img src="@Model.ImageSrc" style="height: 30px; width: 30px;" />
<input type="checkbox" asp-for="Checked" /> @Model.Title
<input type="hidden" asp-for="AmenityId" />
</div>