2010-11-24 32 views
1

我有一個包含表單的局部視圖,並且此局部視圖存在於包含其他一些表單和html的視圖中。
當我按提交併且驗證失敗時,它會在URL中顯示此部分視圖表單操作,而不是原始URL。部分視圖在URL中顯示其操作而不是容器視圖操作

父視圖「用戶帳戶」: - 登錄局部視圖 - 註冊局部視圖

原始地址時,頁面打開爲:/用戶/帳戶
URL時,寄存器驗證失敗變成:/用戶/寄存器

這裏是我的局部視圖:

<%@ 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?

原始地址:
alt text

驗證網址後:
alt text

回答

2

您發佈到/ users/register,這就是返回響應的內容。

爲了避免這種情況之一:

  1. 後到創建 頁的動作 - 也許不可能的,如果你 有幾種形式
  2. 或而非 返回視圖返回 redirecttoaction到原始動作

如果您重定向到一個動作,但您需要處理模型數據,也許從幾個子動作 - 您可以將數據傳回TempData集合以進行重定向。

0

您需要返回包含視圖。發生什麼事是因爲modelstate無效,它只返回部分視圖。這意味着,不知何故,你將不得不將你的局部視圖的模型狀態恢復到局部視圖。我曾經通過讓我的父視圖有一個包含子模型的模型來做到這一點。

像這樣的事情

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

則在帳戶視圖

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

然後你就可以建立ParentViewModel並在RegisterViewModel傾倒,然後返回客戶視圖時的ModelState是無效的。在註冊行動中,你會有這樣的事情。

if (ModelState.IsValid) 
{ 
    ... 
} 

var parentModel = new ParentViewModel() 
{ 
    RegisterModel = model; 
}; 

return View("Account", parentModel); 

只要確保你總是初始化RegisterModel或者你會得到一個錯誤。

+0

我的確如你在你的例子中寫的那樣,但它給了我和我的問題相同的結果:(你知道問題出在哪裏嗎? – 2010-11-25 15:04:49