我正在尝试创建一个编辑预定义模型列表的视图。 因此,它是一个强类型视图,它将模型列表作为参数。 我使用自定义Html助手来编辑各个模型。 Get视图显示正确,但post back视图模型(模型列表)始终为null。 我知道这里有很多关于这个话题的问题,但我现在已经尝试了2天了。
这是基础模型:
public class PrivacyManagerModel
{
[Required]
[Display(Name="Privacy Type Id")]
public int PrivaceTypeId { get; set; }
[Required]
[Display(Name = "Visibility Level Id")]
public int VisibilityLevelId { get; set; }
}
以下是控制器操作:
//GET: /Profile/ManagePrivacy
[Authorize]
public ActionResult ManagePrivacy()
{
PrivacyTypeService _privacyTypeService=new PrivacyTypeService();
IEnumerable<PrivacyFlagType> privacyTypes = _privacyTypeService.GetPrivacyFlagTypes();
List<PrivacyManagerModel> model=new List<PrivacyManagerModel>();
foreach (PrivacyFlagType type in privacyTypes)
{
PrivacyManagerModel temp=new PrivacyManagerModel();
temp.PrivaceTypeId=type.PrivacyFlagTypeId;
model.Add(temp);
}
ViewBag.privacyTypes=privacyTypes;
return View(model);
}
//POST: /Profile/ManagePrivacy
[Authorize]
[HttpPost]
public ActionResult ManagePrivacy(IEnumerable<PrivacyManagerModel> model)
{
if (ModelState.IsValid)
{
do stuff
}
else
{
return View(model);
}
}
这是尝试编辑PrivacyManagerModel
列表的视图:
@model IEnumerable<Klever.PrivacyManagerModel>
@using Klever
@{
ViewBag.Title = "ManagePrivacy";
var _privacyTypes = ViewBag.privacyTypes as IEnumerable<PrivacyFlagType>;
}
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
@foreach(PrivacyManagerModel item in Model)
{
<div class="display-label">
@Html.DisplayFor(modelItem=>item.PrivaceTypeId)
</div>
<div class="editor-field">
@Html.EditorFor(modelItem=>item)
</div>
}
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
最后是PrivacyManagerModel
的Html助手EditTemplate:
@model Klever.PrivacyManagerModel
@using Klever.Components
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@{
PrivacyTypeService _privacyService = new PrivacyTypeService();
var visibilityLevels=_privacyService.GetVisibilityLevels();
}
<fieldset>
<div class="editor-label">
@Html.LabelFor(model => model.PrivaceTypeId)
</div>
<div class="editor-field">
@Html.DropDownListFor(model=>model.VisibilityLevelId,new SelectList(visibilityLevels,"VisibilityLevelId","Name"))
@Html.ValidationMessageFor(model => model.VisibilityLevelId)
</div>
</fieldset>
同样,GET动作工作正常(它正确显示视图)但Post动作总是接收Null模型作为参数。 非常感谢你的帮助。 感谢
答案 0 :(得分:1)
你可以试试这个。当我在一个项目中使用MVC 3站点时,我遇到了类似的问题。原因是MVC平台无法从View中的值生成模型,因为当我们应用foreach循环并为循环中的任何项创建控件时为“@ Html.DisplayFor(modelItem =&gt; item.PrivaceTypeId) )“分配给HTML控件的id / name将是”item.PrivaceTypeId“。但是在下面给出的示例中,分配给HTML控件的id / name将是“Model [0] .PrivaceTypeId”,“Model [1] .PrivaceTypeId”,依此类推......这将有助于创建Model(集合)来自视图中的值。
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
@for(int i = 0; i <= Model.Count; i++)
{
<div class="display-label">
@Html.DisplayFor(modelItem=>Model[i].PrivaceTypeId)
</div>
<div class="editor-field">
@Html.EditorFor(modelItem=>Model[i])
</div>
}
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
我不确定MVC平台是否能够从编辑器模板创建模型,因为我现在没有VS.你可以查看一下。但这肯定会奏效,因为它对我有效4-5次。