【问题标题】:Model returned to controller by edit view is always null编辑视图返回给控制器的模型始终为空
【发布时间】:2012-03-22 10:28:21
【问题描述】:

我正在尝试创建一个编辑预定义模型列表的视图。 因此,它是一个以模型列表为参数的强类型视图。 我使用自定义 Html 助手来编辑各个模型。 Get 视图显示正确,但后发视图模型(模型列表)始终为空。 我知道这里有很多关于这个主题的问题,但我已经尝试了 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 模型作为参数。 非常感谢您的帮助。 谢谢

【问题讨论】:

    标签: c# asp.net-mvc-3 drop-down-menu http-post editview


    【解决方案1】:

    你可以试试这个。当我在一个项目中处理 MVC 3 站点时,我遇到了类似的问题。原因是 MVC 平台无法从视图中的值生成模型,因为当我们应用 foreach 循环并为循环中的任何项目创建控件时,如“@Html.DisplayFor(modelItem=>item.PrivaceTypeId) " 分配给 HTML 控件的 ID/名称将是 "item.PrivaceTypeId"。但在下面给出的示例中,分配给 HTML 控件的 id/名称将是“Model[0].PrivaceTypeId”、“Model[1].PrivaceTypeId”等等......这将有助于创建模型(集合)来自视图中的值。

    @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 次。

    【讨论】:

    • 我明白你在说什么,但我的模型是 IEnumerable 类型,我无法访问像“Model.[index]”这样的元素。
    • 好的,现在可以了。我更改了代码以传递 PrivacyManagerModel 数组而不是 IEnumerable。非常感谢!你是对的
    • 我的模型是 IList 类型的,我们可以在通用列表中添加索引器。
    • 谢谢。我使用IList 而不是IEnumerable 并访问像“Model [index]”这样的元素。它有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    相关资源
    最近更新 更多