我有一个包含表单的局部视图,这个局部视图存在于一个视图中,其中包含一些其他形式和html。
当我按下提交并且验证失败时,它会在URL中显示此部分视图表单操作,而不是原始URL。
父视图“用户帐户”: - 登录部分视图 - 注册部分视图
打开页面时的原始网址为:/ users / account
注册验证失败时的URL变为:/ users / register
以下是我的部分观点:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<PicGhost.Website.ViewModels.RegisterViewModel>" %>
<% using (Html.BeginForm("Register", "Users", FormMethod.Post)) {%>
<%: Html.ValidationSummary(true) %>
<fieldset>
<legend>Fields</legend>
<div class="editor-label">
<%: Html.LabelFor(model => model.UserName) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.UserName) %>
<%: Html.ValidationMessageFor(model => model.UserName) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Email) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Email) %>
<%: Html.ValidationMessageFor(model => model.Email) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Password) %>
</div>
<div class="editor-field">
<%: Html.PasswordFor(model => model.Password)%>
<%: Html.ValidationMessageFor(model => model.Password) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.ConfirmPassword) %>
</div>
<div class="editor-field">
<%: Html.PasswordFor(model => model.ConfirmPassword) %>
<%: Html.ValidationMessageFor(model => model.ConfirmPassword) %>
</div>
<p>
<input type="submit" value="Register" />
</p>
</fieldset>
<% } %>
注册行动:
[HttpPost]
public ActionResult Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
IUser user = _factory.CreateUser(model.UserName, model.Email, model.Password);
UserRepository.Add(user);
return RedirectToAction("Index");
}
return View(model);
}
如何避免显示此错误的URl并保留原始网址?
原始网址:
验证URL后:
答案 0 :(得分:2)
您发布到/ users / register,这就是返回响应的内容。
要避免这种情况:
如果您重定向到某个操作,但您需要处理模型数据(可能来自多个子操作) - 您可以将数据传回TempData集合中以进行重定向。
答案 1 :(得分:0)
您需要返回包含的视图。发生的事情是因为modelstate无效,它只返回部分视图。这意味着,不知何故,您必须将局部视图的模型状态恢复到局部视图中。通过让我的父视图具有包含子模型的模型,我做了一次。
像这样的东西
public class ParentViewModel
{
public RegisterViewModel RegisterModel { get; set; }
}
然后在帐户视图中
<% Html.RenderPartial("Register", Model.RegisterModel); %>
然后,您可以在RegisterViewModel中构建ParentViewModel并转储,然后在ModelState无效时返回Account视图。在注册操作中你会有类似的东西。
if (ModelState.IsValid)
{
...
}
var parentModel = new ParentViewModel()
{
RegisterModel = model;
};
return View("Account", parentModel);
请确保您始终初始化RegisterModel,否则您将收到错误。