ASP .NET MVC. Проблемы с моделями и формами - PullRequest
1 голос
/ 30 апреля 2011

Я пытаюсь опубликовать часть своей модели для просмотра в другом контроллере.Я пытался сделать это следующим образом:

    <% using (Html.BeginForm("Register", "User", new {createDto = Model.UserCreateDto}, FormMethod.Post))
    {%>
          Form code here...
    <%}%>

UserCreateDto является частью моей модели, и он заполняется в этой форме.Я пытаюсь передать его в действие «Зарегистрировать» в UsersController:

[HttpPost]
public ActionResult Register(UserCreateDto createDto)

Проблема в том, что значение маршрута в действии «Регистр» является нулевым (createDto) после отправки формы.Возможно, это происходит потому, что значения маршрута прикрепляются к URL до события отправки формы (и до заполнения полей модели).
Есть ли способ сделать то, что я хочу?
ОБНОВЛЕНИЕ Вотфактический HTML-код:

<form action="/User/Register" id="form1" method="post">
        <input id="UserCreateDto_Username" name="UserCreateDto.Username" type="hidden" value="" />

        <input id="UserCreateDto_Password" name="UserCreateDto.Password" type="hidden" value="" />

        <input id="UserCreateDto_Email" name="UserCreateDto.Email" type="hidden" value="" />

        <input id="UserCreateDto_Active" name="UserCreateDto.Active" type="hidden" value="" />

        <span class="field-validation-valid" id="UserCreateDto_Username_validationMessage"></span><br /><label for="UserCreateDto_Username">Имя пользователя</label><br /><input id="UserCreateDto_Username" name="UserCreateDto.Username" type="text" value="" /><br />

        <span class="field-validation-valid" id="UserCreateDto_Password_validationMessage"></span><br /><label for="UserCreateDto_Password">Пароль</label><br /><input id="UserCreateDto_Password" name="UserCreateDto.Password" type="text" value="" /><br />

        <span class="field-validation-valid" id="UserCreateDto_Email_validationMessage"></span><br /><label for="UserCreateDto_Email">E-mail</label><br /><input id="UserCreateDto_Email" name="UserCreateDto.Email" type="text" value="" /><br />

        <input type="submit" value="Register"/>

</form>

А вот обновленный код формы:

    <% using (Html.BeginForm("Register", "User", FormMethod.Post))
    {%>
        <%: Html.HiddenFor(userCreateDto => Model.UserCreateDto.Username) %>
        <%: Html.HiddenFor(userCreateDto => Model.UserCreateDto.Password) %>
        <%: Html.HiddenFor(userCreateDto => Model.UserCreateDto.Email) %>
        <%: Html.HiddenFor(userCreateDto => Model.UserCreateDto.Active) %>
        <%= Html.LabeledValidatedTextBoxFor(username => Model.UserCreateDto.Username, true) %>
        <%= Html.LabeledValidatedTextBoxFor(password => Model.UserCreateDto.Password, true)%>
        <%= Html.LabeledValidatedTextBoxFor(email => Model.UserCreateDto.Email, true)%>
        <input type="submit" value="Register"/>
    <%}%>

Html.LabeledValidatedTextBoxFor - это всего лишь мой помощник HTML-кода Custon.
Вот обновленная подпись действия:

    [HttpPost]
    public ActionResult Register(UserCreateDto userCreateDto)

userCreateDto в этом действии все еще null.Кстати, есть ли способ не использовать скрытые поля?Они недостаточно безопасны для передачи через них регистрационной информации пользователя.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2011

Предполагая, что UserCreateDto является классом, это не сработает, так как будет сериализовать его в строку в URL-адресе действия формы. Вероятно, вы хотите использовать скрытые поля для заполнения полей UserCreateDto в самой форме. Это позволит свойствам модели задавать параметры формы при повторной отправке формы, что позволяет связующему модели выполнять свою работу и восстанавливать объект в параметрах метода действия.

<% using (Html.BeginForm("Register", "User"))
{%>
      <%: Html.HiddenFor( model => model.UserCreateDto.UserID ) %>
      <%: Html.HiddenFor( model => model.UserCreateDto.Username ) %>
      ...
<%}%>

На стороне сервера это должно выглядеть так:

[HttpPost]
public ActionResult Register(UserCreateDto userCreateDto)

[редактировать]

В качестве альтернативы, вы можете просто сохранить UserCreateDto в сеансе пользователя и получить его по почте, поскольку вы не доверяете помещению данных в скрытое поле.

0 голосов
/ 03 мая 2011

Я решил использовать частичные представления, чтобы вся логика регистрации пользователей теперь была инкапсулирована в контроллере пользователей.Также я начал использовать формы Ajax (с помощью JQuery).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...