编辑视图返回给控制器的模型始终为null

本文关键字:null 模型 视图 返回 控制器 编辑 | 更新日期: 2023-09-27 18:28:33

我正在尝试创建一个视图来编辑预定义模型的列表。因此,它是一个以模型列表为参数的强类型视图。我使用自定义的Html助手来编辑各个模型。Get视图显示正确,但post-back视图模型(模型列表)始终为null。我知道关于这个话题有很多问题,但我已经试着做了两天了。

以下是基本型号:

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模型作为参数。我非常感谢你的帮助。感谢

编辑视图返回给控制器的模型始终为null

你可以试试这个。当我在一个项目中的MVC 3网站上工作时,我也遇到了类似的问题。原因是MVC平台无法从View中的值生成模型,因为当我们应用foreach循环并为循环中的任何项创建控件为"@Html.DisplayFor(modelItem=>item.PrivaceTypeId)"时,分配给Html控件的id/名称将是"item.PrivateTypeId"。但在下面给出的示例中,分配给Html控件的id/name将是"Model[0].PrivateTypeId","Model[1].PrivatetTypeId",等等…这将有助于根据视图中的值创建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次作用。