部分视图在URL中显示其操作,而不是容器视图操作

时间:2010-11-24 22:12:43

标签: c# asp.net-mvc-2 .net-4.0 partial-views

我有一个包含表单的局部视图,这个局部视图存在于一个视图中,其中包含一些其他形式和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并保留原始网址?

原始网址:
alt text

验证URL后:
alt text

2 个答案:

答案 0 :(得分:2)

您发布到/ users / register,这就是返回响应的内容。

要避免这种情况:

  1. 发布创建的动作 页面 - 如果你可能不可能 有几种形式
  2. 或者不是 返回视图返回a 将行动重定向到原始行动
  3. 如果您重定向到某个操作,但您需要处理模型数据(可能来自多个子操作) - 您可以将数据传回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,否则您将收到错误。