我正在尝试发布我的模型的一部分,以便在另一个控制器中执行操作。我试过这样做:
<% 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。顺便问一下,有没有办法不使用隐藏字段?它们不够安全,无法通过用户注册信息。
答案 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的帮助下)。