Модель, возвращаемая в контроллер в режиме редактирования, всегда равна нулю - PullRequest
0 голосов
/ 22 марта 2012

Я пытаюсь сделать вид, который редактирует список предопределенных моделей.Поэтому это строго типизированное представление, которое принимает в качестве параметра список моделей.Я использую пользовательские помощники HTML для редактирования отдельных моделей.Представление «Получить» отображается правильно, но модель представления с обратной связью (список моделей) всегда равна нулю.Я знаю, что здесь есть много вопросов по этой теме, но я пытался сделать это в течение 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>

и, наконец, Html-помощник EditTemplate дляPrivacyManagerModel:

@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 всегда получает нулевую модель в качестве параметра.Я был бы очень признателен за вашу помощь.Спасибо

1 Ответ

1 голос
/ 22 марта 2012

Вы можете попробовать это. У меня была похожая проблема, когда я работал над сайтом MVC 3 в проекте. Причина в том, что платформа MVC не может генерировать модель обратно из значений в представлении, потому что когда мы применяем цикл foreach и создаем элемент управления для любого элемента в цикле как "@ Html.DisplayFor (modelItem => item.PrivaceTypeId) «идентификатор / имя, назначенное элементу управления HTML, будет« item.PrivaceTypeId ». Но в приведенном ниже примере идентификатором / именем, назначенным элементу управления HTML, будет «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 раз.

...