asp.net mvc.模型和表单的问题
本文关键字:表单 问题 模型 net mvc asp | 更新日期: 2023-09-27 17:54:11
我正试图在另一个控制器中发布视图的一部分模型。我试过这样做:
<% using (Html.BeginForm("Register", "User", new {createDto = Model.UserCreateDto}, FormMethod.Post))
{%>
Form code here...
<%}%>
UserCreateDto是我的模型的一部分,它被填写在这个表单中。我试图将其传递给UsersController中的"Register"动作:
[HttpPost]
public ActionResult Register(UserCreateDto createDto)
问题是注册动作中的路由值在表单提交后为null (createDto)。也许这是因为路由值在表单提交事件之前被附加到url(在模型字段被填充之前)。
有什么办法能做到我想要的吗?
UPDATE下面是实际的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在此操作中仍然为空。顺便问一下,有没有办法不使用隐藏字段?它们不够安全,无法通过它们传递用户注册信息。
假设UserCreateDto是一个类,这将不起作用,因为它将在表单action 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存储在用户会话中,并在post时检索它,因为您不相信将数据放在隐藏字段中。
我决定使用部分视图,以便现在所有用户注册逻辑都封装在Users控制器中。我还开始使用Ajax表单(在JQuery的帮助下)。