2015-01-26 6 views
1

Вероятно, здесь нет ничего очевидного, но моя модель, отправленная в контроллер, всегда равна null ... Модель правильно переходит к представлению, и я могу получить доступ к свойствам, но при отправке формы модель нулевой. Зачем?MVC модель бритвы post

модель ...

public class ProfileModel 
{ 

    public MembershipUser user { get; set; } 
    public ProfileSettingsModel settings { get; set; } 


} 

контроллер ...

[HttpPost] 
    public ActionResult SaveSettings(ProfileModel model) 
    { 
     var x = model.user.UserName; 
     return View(); 
    } 

... Посмотреть

@model MyApp.Models.Profile.ProfileModel 

@using(Html.BeginForm("SaveSettings","Profile")) 
    { 

     //Tried removing these as I shouldn't need them, but no luck. 
     @Html.HiddenFor(x=>x.settings) 
     @Html.HiddenFor(x=>x.user) 

     @Html.CheckBoxFor(model=>model.settings.VisitorsCanAddMeAsFriend) 
     @Html.LabelFor(x=>x.settings.VisitorsCanAddMeAsFriend, "Visitors can add me as a friend") 
     @Html.CheckBoxFor(x=>x.settings.VisitorsCanMessageMe) 
     @Html.LabelFor(x=>x.settings.VisitorsCanMessageMe, "Visitors can message me") 

     <button id="save" type="submit" class="btn btn-default">Save</button> 

    } 

Вынесено HTML ...

<form action="/Profile/SaveSettings?HttpMethod=POST&amp;InsertionMode=Replace&amp;LoadingElementDuration=0&amp;AllowCache=False" method="post" novalidate="novalidate"> 
    <input data-val="true" data-val-required="The VisitorsCanAddMeAsFriend field is required." id="settings_VisitorsCanAddMeAsFriend" name="settings.VisitorsCanAddMeAsFriend" type="checkbox" value="true"> 
    <input name="settings.VisitorsCanAddMeAsFriend" type="hidden" value="false"> 
    <label for="settings_VisitorsCanAddMeAsFriend">Visitors can add me as a friend</label> 
    <input data-val="true" data-val-required="The VisitorsCanMessageMe field is required." id="settings_VisitorsCanMessageMe" name="settings.VisitorsCanMessageMe" type="checkbox" value="true"> 
    <input name="settings.VisitorsCanMessageMe" type="hidden" value="false"> 
    <label for="settings_VisitorsCanMessageMe">Visitors can message me</label>     
    <button id="save" type="submit" class="btn btn-default">Save</button> 
</form> 

Есть ли что-то очевидное?

+0

Просьба указать ваш ** визуализированный ** HTML. – Dai

+0

Вам нужно вернуть свой профиль ProfileModel. –

+0

'@using (Html.BeginForm (« SaveSettings »,« Profile »))' не отображает html, который вы указали (для тега 'form'). Показать реальный html. –

ответ

2

Вы не можете использовать MemberhipUser в привязке к модели. Для привязки модели требуется, чтобы все свойства имели открытый конструктор без параметров, а конструктор MemberlessUser без параметров был защищен. Таким образом, вы не можете использовать его напрямую. Вам нужно будет создать свою собственную модель представления, чтобы передать свойства.

Итак, удаляя настройки и пользовательские HiddenFor, вы можете получить то, что хотите.

+0

Разве это не так? Я могу передать MemberhipUser в представление и получить доступ к его свойствам - кажется, такой позор, что я не могу обновить эти свойства, если я не создам новую модель, которая точно такая же, как и конструктор. :( – pookie

+1

@Rich - Вы действительно не должны этого делать в любом случае. MemberhipUser содержит свойства, которые вы не хотите показывать клиенту. Например, злоумышленник может изменять скрытые значения с помощью клиентских инструментов и изменять их последний логин или они одобрены или заблокированы. Это внутренние структуры, на которые вы не можете просто принять вход клиента. –

+0

спасибо за помощь. Думаю, я понимаю это сейчас. Спасибо всем за помощь! – pookie

2

Изменить

@Html.HiddenFor(x=>x.settings) 
@Html.HiddenFor(x=>x.user) 

Для

@Html.HiddenFor(x => x.user.UserName) 

Связыватель по умолчанию должен, по крайней мере, выбрать, что один.

+0

Он сделал, но потом жаловался, что «Для этого объекта не определен конструктор без параметров». – pookie

+0

Привязка модели не работает, если у вас нет конструктора без параметров для ваших моделей. Опубликуйте модели для 'MembershipUser' и' ProfileSettingsModel' –

+0

@StephenMuecke - членствоUser, скорее всего, System.Web.Security.MembershipUser, который имеет защищенный конструктор, поэтому не может использоваться для привязки к модели. –

0

Я не думал, что вы можете сделать html.hiddenfor (сложный тип), поскольку значение должно быть представлено в виде строки. В вашем рендеринге html вы можете видеть, что тогда два HiddenFor не отображаются как тип ввода = 'hidden' ...../

Итак, очевидная ошибка - это два html.hiddenfor. Вам нужно будет сделать HiddenFor или каждую собственность, которую вы хотите получить в сообщении

-1

В методе обратной передачи контроллера, последняя строка говорит

return View(); 

но он должен сказать

return View(model); 

иначе вы не передавая модель обратно на страницу.

Смежные вопросы