2017-03-15 12 views
2

私はNopCommerce v3.80で作業しています。デフォルトでは、ログインビューとレジスタビューは異なります。私は多くのコードを変更することなくそれらをマージする必要があったので、Login.cshtmlの中に@{ RenderAction("Register"); }と呼んだ。ASP.NET mvc RenderActionログインとレジスタビュー

また、レジスタビューからレイアウト(Layout = "~/Views/Shared/_ColumnsOne.cshtml";)を削除しました。

「メールIDが既に存在します!」のような検証エラーが発生すると問題が発生します。それがレジスタビューに移動します。ログインビューに検証またはエラーメッセージを表示する必要があります。ログインビューはログインモデルのみを受け入れます。

参照してください私のコード:

Register.cshtml

@model RegisterModel 
@using Nop.Web.Models.Customer; 
@{ 
    //Layout = "~/Views/Shared/_ColumnsOne.cshtml"; 
} 

<!-- Registeration fields --> 

Login.cshtml

@model LoginModel 
@using Nop.Web.Models.Customer; 
@{ 
    Layout = "~/Views/Shared/_ColumnsOneTT.cshtml"; 
} 

@using (Html.BeginForm("Register", "Customer", FormMethod.Post)){ 
<div> 
@{ 
    Html.RenderAction("Register"); 
} 
<input type="submit" value="Submit"/> 
} 

CustomerController.cs - メソッド

を登録0
public ActionResult Register(RegisterModel model){ 
    // Lot of code 
    if (success){ 
    // lot of code 
     return RedirectToRoute("RegisterResult"); 
    } 
    foreach (var error in registrationResult.Errors) 
     ModelState.AddModelError("", error); 
    PrepareCustomerRegisterModel(model, true, customerAttributesXml); 
    return View(model); 

} 

UPDATE:私はhow to work with two forms in a single viewをチェックするが、私は新しいモデルの作成オプションで行くことができないとして、それは私を助けにはなりません。

UPDATE 2:また、ログインモデルや登録モデルをカバーする新しいモデル作成オプションを試しましたが、私はまだ同じ結果を得ています。

+0

@using (Html.BeginForm("Register", "Customer", FormMethod.Post)){ <!-- divs and other elements --> @Html.Partial("_RegisterModel", Model.RegisterModel) <!-- divs and other elements --> } 

とログインフォームあなたが登録アクションでビュー(モデル)戻ってきているので、それがあります。登録アクションで部分的なビューを返すことができます。または、あなたの登録を部分的な視点で作る方が良いでしょう。 – jomsk1e

+0

@ jomsk1e私は部分的なビューを返そうとしました。変更はありません。 –

+0

部分ビューを返し、この行に登録するのではなく、ログインアクションでフォームをポストするように変更します。 '(Html.BeginForm(" Register "、" Customer "、FormMethod.Post))' – jomsk1e

答えて

1

ありがとうございます。私は新しいモデルを作成し、2つのモデルを登録してログインする必要がありました。

how to work with two forms in a single viewのように見えます。

しかし、私は初心者のための完全なソリューションを投稿しています。

CustomerController:

ページをロード

public ActionResult Login(bool? checkoutAsGuest) 
     { 
      var loginModel= new LoginModel(); 
      loginModel.UsernamesEnabled = _customerSettings.UsernamesEnabled; 
      loginModel.CheckoutAsGuest = checkoutAsGuest.GetValueOrDefault(); 
      loginModel.DisplayCaptcha = _captchaSettings.Enabled && _captchaSettings.ShowOnLoginPage; 

      var registerModel = new RegisterModel(); 
      PrepareCustomerRegisterModel(registerModel, false); 
      registerModel.Newsletter = _customerSettings.NewsletterTickedByDefault; 

      return View(new LoginRegisterModel { LoginModel = , RegisterModel = registerModel }); 
     } 

ログインPOST:

public ActionResult Login(LoginModel model, string returnUrl, bool captchaValid) 
     { 
     // Previous code as it is 
     // Important! I Added this new line - to handle validation problems 
     ModelState.Add("LoginValidation", null); 
     //If we got this far, something failed, redisplay form 
     model.UsernamesEnabled = _customerSettings.UsernamesEnabled; 
     model.DisplayCaptcha = _captchaSettings.Enabled && _captchaSettings.ShowOnLoginPage; 

     var registerModel = new RegisterModel(); 
     PrepareCustomerRegisterModel(registerModel, false); 
     //enable newsletter by default 
     registerModel.Newsletter = _customerSettings.NewsletterTickedByDefault; 

     return View(new LoginRegisterModel { LoginModel = model, RegisterModel = registerModel }); 
    } 

レジスTER:

public ActionResult Register() 
     { 
      //check whether registration is allowed 
      if (_customerSettings.UserRegistrationType == UserRegistrationType.Disabled) 
       return RedirectToRoute("RegisterResult", new { resultId = (int)UserRegistrationType.Disabled }); 

      var model = new RegisterModel(); 
      PrepareCustomerRegisterModel(model, false); 
      model.Newsletter = _customerSettings.NewsletterTickedByDefault; 

      var loginModel = new LoginModel(); 
      loginModel.UsernamesEnabled = _customerSettings.UsernamesEnabled; 
      loginModel.DisplayCaptcha = _captchaSettings.Enabled && _captchaSettings.ShowOnLoginPage; 

      return View("Login", new LoginRegisterModel { RegisterModel = model, LoginModel = loginModel }); 

     } 

登録POSTは: - _LoginModel.cshtml_registerModel.cshtml

public ActionResult Register(RegisterModel model, string returnUrl, bool captchaValid, FormCollection form) 
     { 
      // previous code as it is 
      // added this line to handle validations 

      ModelState.Add("RegisterValidation", null); 
      //If we got this far, something failed, redisplay form 
      PrepareCustomerRegisterModel(model, true, customerAttributesXml); 

      var loginModel = new LoginModel(); 
      loginModel.UsernamesEnabled = _customerSettings.UsernamesEnabled; 
      //loginModel.CheckoutAsGuest = checkoutAsGuest.GetValueOrDefault(); 
      loginModel.DisplayCaptcha = _captchaSettings.Enabled && _captchaSettings.ShowOnLoginPage; 

      return View("Login", new LoginRegisterModel { RegisterModel = model, LoginModel = loginModel }); 
     } 

は次に、2つの部分的なビューを作成しました。

if (!MvcHtmlString.IsNullOrEmpty(validationSummary) && ViewData.ModelState.ContainsKey("LoginValidation")) 
    { 
     <div class="message-error">@validationSummary</div> 
    } 

_RegisterModel.cshtml

@if (!MvcHtmlString.IsNullOrEmpty(validationSummary) && ViewData.ModelState.ContainsKey("RegisterValidation")) 
    { 
     <div class="message-error">@validationSummary</div> 
    } 

、最終的には、ログインページ

ログイン:ビューでは、私は一つだけの余分なライン

_LoginModel.cshtmlを追加しました。 cshtml

交換し、登録ボタン(と左のパネル)

@using (Html.BeginForm("Login", "Customer", new { returnUrl = Request.QueryString["returnUrl"] }, FormMethod.Post)) 
         { 
         <!-- divs and other elements --> 
         @Html.Partial("_LoginModel", Model.LoginModel) 
<!-- divs and other elements --> 
         } 
3

あなたがしようとしているのは、あなたが扱っている特定のモデルに有効範囲があるので、あなたがすでに行っているより重要なコード変更がなければ、実際に実行できません。

私が考えることができる最も簡単な効果的なソリューションは、Loginビューのモデルを他の2つのモデルのラッパーに変更することです。

public class AuthenticationModel { 
    public LoginModel Login {get;set;} 
    public RegisterModel Register {get;set;} 
    public AuthenticationModel (LoginModel lModel, RegisterModel rModel) { 
     Login = lModel; 
     Register = rModel; 
    } 
} 

検証メッセージが正しく構造を対象としなければならないであろうが、これは、あなたが持っている問題のほとんどを解決する必要があります。

ModelState.AddModelError("Register", error); 
:あなたのコード内

ModelState.AddModelError("", error); 

が置き換えられます

+0

return文として何を書きますか?登録のPOSTメソッドで? PartialView( "_ Register"、registerModel)を返したり、View( "Index"、authenticationModel)を返しますか? –

+0

ajaxでこれらのアクションを処理するための特別なコードがない場合は、ページのリロードを処理しているため、View( "Index"、authenticationModel)が適切な方法です。 –

1

モデルを両方のモデルを含むビューモデルに結合することは別としても(この場合はおそらくそうしなければならないでしょう)、安価で簡単なオプションはエラーを検出してbaを渡すことですviewbagプロパティとしてck。フロントエンドでは、そのプロパティがnullではないかどうかをチェックし、そうであればエラーメッセージを表示することができます。

あなたはビューモデルを作成する必要がありますが、それ以外のものはすべてバンドエイドの回避策です。

0

ログインモデルと登録モデルを新しいモデルにマージして、目的のモデルに検証を適用することができます。

関連する問題