ASP .NET MVC。模型和表格的问题

时间:2011-04-30 19:04:22

标签: c# .net asp.net-mvc asp.net-mvc-2 model

我正在尝试发布我的模型的一部分,以便在另一个控制器中执行操作。我试过这样做:

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

UserCreateDto是我模型的一部分,它正在填写此表单。我正在尝试将其传递给UsersController中的“注册”操作:

[HttpPost]
public ActionResult Register(UserCreateDto createDto)

问题是表单提交后,Register操作中的路由值为null(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助手 这是更新的行动签名:

    [HttpPost]
    public ActionResult Register(UserCreateDto userCreateDto)
此操作中的

userСreateDto仍为null。顺便问一下,有没有办法不使用隐藏字段?它们不够安全,无法通过用户注册信息。

2 个答案:

答案 0 :(得分:2)

假设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存储在用户的会话中,并在帖子中检索它,因为您不相信将数据放在隐藏字段中。

答案 1 :(得分:0)

我决定使用部分视图,以便现在所有用户注册逻辑都包含在Users控制器中。我也开始使用Ajax表单(在JQuery的帮助下)。