【问题标题】:Partial view Shows its action in the URL instead of the container view action部分视图在 URL 中显示其操作,而不是容器视图操作
【发布时间】:2010-11-24 22:12:43
【问题描述】:

我有一个包含表单的局部视图,并且此局部视图存在于包含其他一些表单和 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?

原网址:

验证后网址:

【问题讨论】:

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


    【解决方案1】:

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

    为了避免这种情况:

    1. 发布到创建 页面 - 如果你可能不可能 有几种形式
    2. 或而不是 返回视图返回一个 重定向到原始操作

    如果您重定向到某个操作,尽管您需要处理模型数据,可能来自多个子操作 - 您可以将数据传回 TempData 集合中以进行重定向。

    【讨论】:

      【解决方案2】:

      您需要返回包含视图。发生的事情是因为模型状态无效,它只返回部分视图。这意味着,您必须以某种方式将局部视图的模型状态恢复到局部视图中。我通过让我的父视图有一个包含子模型的模型来做到这一点。

      类似的东西

      public class ParentViewModel
      {
          public RegisterViewModel RegisterModel { get; set; }
      }
      

      然后在帐户视图中

      <% Html.RenderPartial("Register", Model.RegisterModel); %>
      

      然后你可以在RegisterViewModel中构建ParentViewModel并转储,然后在ModelState无效时返回Account视图。在 Register 操作中,您将拥有类似的内容。

      if (ModelState.IsValid)
      {
          ...
      }
      
      var parentModel = new ParentViewModel()
      {
          RegisterModel = model;
      };
      
      return View("Account", parentModel);
      

      只要确保你总是初始化 RegisterModel 否则你会得到一个错误。

      【讨论】:

      • 我完全按照你在你的例子中写的,但它给了我和我的问题一样的结果:(,你知道问题出在哪里吗?
      • 因为你调用的是Register方法,而方法的最后一行是return View(model);。当您不指定视图时,它会返回与当前正在执行的操作同名的视图。在这种情况下,注册。
      • 不,我改成这个 return View("Account", parentModel);正如您在答案中列出的那样
      猜你喜欢
      • 1970-01-01
      • 2016-04-26
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多