6

ホームページに登録フォームとログインフォームを表示する必要があります。

これら 2 つのフォームで検証が失敗した場合は、ホームページに適切なエラーを表示する必要があります。

ただし、エラーが発生しなかった場合は、ユーザーを安全なダッシュボードにリダイレクトする必要があります。

これを達成するために、私はchild actionホームページで次のように使用しています。

@Html.Action("Register", "Membership")

情報を持っている適切なものを使用できるためre-render、エラーが発生した場合でも期待どおりに完全に機能します。partial viewmodelvalidation state

しかし、エラーがなければ、リダイレクトしようとすると、次のようなエラーがスローされます。

Child actions are not allowed to perform redirect actions.

これを回避する方法はありますか?ホームページに登録フォームとログインフォームを配置する方法があると思います。私は ASP .Net MVC にまったく慣れていないので、おそらくわかりません。

ここで正しい方向に向けてもらえますか?

4

3 に答える 3

6

これを行う 1 つの方法は、ログインおよび登録ビットに ajax フォームを使用し、送信が有効な場合に RedirectResult を返す代わりに、クライアント側のスクリプトが監視してリダイレクトを行うために使用する json を返すことです。あなたのために。

簡単な例を次に示します。

コントローラ:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.ComponentModel.DataAnnotations;
using MvcApplication12.Models;

namespace MvcApplication12.Controllers
{
    public class HomeController : Controller
    { 
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Register()
        {
            return PartialView(new UserDetails());
        }

        [HttpPost]
        public ActionResult Register(UserDetails details)
        {
            if (ModelState.IsValid)
            {
                return Json(new {redirect = true, url = Url.Action("Index","Dashboard")});
            }
            else
            {
                return PartialView(details); 
            }
        } 
    }
}

ホームページの「インデックス」ビュー:

@{
    ViewBag.Title = "Index";
}
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script type="text/javascript">
    function checkForRedirect(data)
    {
        if (data.redirect && data.url)
        {
            location.href = data.url;
        }
    }
</script>

<p>Home page stuff.....</p>

<div id="RegistrationArea">
    @Html.Action("Register")
</div>

<p> Home page stuff.....</p>

登録フォーム「登録」部分ビュー:

@model MvcApplication12.Models.UserDetails
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Ajax.BeginForm(new AjaxOptions()
{
    HttpMethod = "POST",
    Url = Url.Action("Register", "Home"),
    OnSuccess = "checkForRedirect(data)",
    UpdateTargetId = "RegistrationArea",
    InsertionMode = InsertionMode.Replace
}))
{
    @Html.LabelFor(m => m.UserName)
    @Html.EditorFor(m => m.UserName) 
    @Html.ValidationMessageFor(m => m.UserName)

    @Html.LabelFor(m => m.Password)
    @Html.EditorFor(m => m.Password) 
    @Html.ValidationMessageFor(m => m.Password)

    <input type="submit" />
}
于 2012-04-06T20:28:41.313 に答える
1

リダイレクトにjavascriptを使わない 場合:子ビュー内にフォームを配置する場合、Beginformヘルパー(子ビュー内)でアクション名とコントローラー名を指定すると、この問題が発生しない場合があります。たとえば、子のアクション ビューを次のように変更しました。

前 :

@using (Html.BeginForm())
{
 ...
}

後 :

    @using (Html.BeginForm("InsertComment", "Comments", FormMethod.Post, new { id = "commentform" })) 
{
 ...
}

これで、「InsertComment」アクション内に RedirectAction コマンドを配置でき、すべてが機能します。


1 つのページ管理で 2 つのフォーム:

1.送信ボタン(各フォーム)の名前を指定する(例:「submitvalue」)

フォーム1:

 <input type="submit" value="login" name="submitValue" class="btn btn-success pull-right" />

フォーム2:

 <input type="submit" value="register" name="submitValue" class="btn btn-success pull-right" />

2.これらのフォームに対して 2 つのアクションを実行します。(例:「登録」と「ログイン」)

[HttpPost]
     public ActionResult Login(LoginVM model, string submitValue)
            {
                if (submitValue == "login")
                { 
               //Do Something
                }  
                 ...
             }


[HttpPost]
public ActionResult Register(RegisterVM model, string submitValue)
            {
                if (submitValue == "register")
                { 
               //Do Something
                 }  
                ...
             }
  • フォームの登録またはログイン ボタンをクリックすると、両方のアクションが呼び出されますが、"if" ステートメントを使用して、どちらがターゲットかを判断します。
于 2014-12-23T11:22:49.350 に答える