我有一个带有集合的ViewModel,例如:
public class CreateCampaignViewModel : ControlPanelViewModel
{
[RequiredField]
public string Name { get; set; }
public List<AdvertisementViewModel> Advertisements { get; set; }
...
}
在视图中,如果我使用它:
@for (int i = 0; i < Model.Advertisements.Count; i++)
{
<fieldset style="z-index: 0;">
<legend>מודעה</legend>
<table style="width: 100%;">
<tr>
<td>
<label for="@Html.NameFor(m => m.Advertisements[i].Title)">כותרת הפרסומת</label></td>
<td>@Html.TextBoxFor(m => m.Advertisements[i].Title)</td>
</tr>
</table>
</fieldset>
}
一切都很好,当我发布表格时我可以看到列表...
但我想将AdvertisementEditor嵌套在Partial View中,因此我的视图变为:
@for (int i = 0; i < Model.Advertisements.Count; i++)
{
Html.RenderPartial("AdvertisementEditor", Model.Advertisements[i]);
}
和我的偏爱:
@model Pushed.Models.AdvertisementViewModel
<fieldset style="z-index: 0;">
<legend>מודעה</legend>
<table style="width: 100%;">
<tr>
<td>
<label for="@Html.NameFor(m => m.Title)">כותרת הפרסומת</label></td>
<td>@Html.TextBoxFor(m => m.Title)</td>
</tr>
</table>
</fieldset>
我的问题是,现在,当我发布表单时,我不会在每个广告的TextBox中获取值。
这是合乎逻辑的,因为现在我的<input>
标签没有'advert [1] .Title'名称,但只有'Title'在我的包含模型中不存在。
如何创建一个反映单个集合项的部分,并使用该表单进行正确的重新发布?
答案 0 :(得分:9)
有两种方法可以告诉MVC.NET前缀输入字段:
创建EditorTemplate而不是PartialView ...它会很有用。
定义TemplateInfo.HtmlFieldPrefix
如图所示调用部分视图:
@{
Html.RenderPartial("TargetAudienceParameters", Model.TargetAudienceParameter,
new ViewDataDictionary {
TemplateInfo = new TemplateInfo {
HtmlFieldPrefix = "Advertisements[4]" // 4 being an example
}
});
}
答案 1 :(得分:1)
在我的项目中,当我触发此问题时,我开始使用ajax查询,该查询在用户离开文本框后触发。这不是最清晰的解决方案,但对我有用。您还需要在每个组元素的局部视图中生成特殊ID。 Smth about:
function eduFacilityTableSave() {
$('#eduFacilityTable tr input[type="text"],#eduFacilityTable tr select').change(function () {
var parId = $(this).parent().parent().attr('id');
var parentName = parId.replace(/\d+/g, '');
var parentId = parId.replace(/\D+/g, '');
var id = $(this).attr('id');
var text = $(this).val();
//alert(text);
$.ajax({
type: "POST",
//contentType: "application/json; charset=utf-8",
url: "/Form/SaveFromForm/",
data: { id: id, parentId: parentId, parentName: parentName, text: text },
dataType: "json",
success: function (data) {
//
}
});
});
}
public JsonResult SaveFromForm(string id, string parentId, string parentName, string text) {
if (parentName == "eduFacility") {
var edufacility = _repository.GetEduFacilityById(Convert.ToInt32(parentId));
if (id == "EntryYearId") {
edufacility.EntryYearId = Convert.ToInt32(text);
}
if (id == "FinishYearId") {
edufacility.FinishYearId = Convert.ToInt32(text);
}
if (id == "FullName") {
edufacility.FullName = text;
}
if (id == "Speciality") {
edufacility.Speciality = text;
}
if (ModelState.IsValid) {
_repository.UpdateEduFacility(edufacility);
_repository.Save();
}
}
return Json("Success", JsonRequestBehavior.AllowGet);
}