2009-05-05 8 views
8


Let`sは私が持っていると言うコンテキスト:レイアウトSite.Masterで
複数のフォーム

<form action="/myApp/Account/Login" method="post"> 
    <input name="name" />Name<br /> 
    <input name="password" type="password" />Password<br /> 
    <button>Login</button> 
</form> 

されています:

<div class="leftColumn"> 
    <asp:ContentPlaceHolder ID="MainContent" runat="server" /> 
</div> 
<div class="rightColumn"> 
    <% Html.RenderPartial("_Login"); %> 
    <asp:ContentPlaceHolder ID="SideContent" runat="server" /> 
</div> 

ログインpartialViewは次のようになりますコンテンツページ全体ではなく、ログインウィジェットフォームのみを更新することは可能ですか?ビューページ

<form action="/tralala/Account/Login" method="post"> 
    <input name="name" />Name<br /> 
    <input name="password" type="password" />Password<br /> 

    <button>Login</button> 
<div style="color: red"><%=ViewData["Message"] %><div> 
</form> 

答えて

15

http投稿を参照している場合は、フォーム内の送信ボタンによって開始された投稿(javascriptで開始することもできます)のみがサーバーに送信されます。

フォームがネストされている場合、これは機能しません。外側のフォームは常にサーバーに送信されます。

下のサンプルHTMLでは、最初のフォームの送信ボタンをクリックしても、2番目のフォームの値はサーバーに送信されません。同様に、2番目の送信ボタンをクリックしても、最初のフォームの値はポストされません。

<html> 
... 
    <body> 
    <div> 

     <form action="/Login/Login" method="post"> 
     <input type="text" name="username" value="" /> 
     <input type="text" name="passowrd" value="" /> 
     <input type="submit" name="login" value="Login" /> 
     </form> 


     <form action="/Login/AdminLogin" method="post"> 
     <input type="text" name="username" value="" /> 
     <input type="text" name="passowrd" value="" /> 
     <input type="submit" name="login" value="Login Admin" /> 
     </form> 
    </div> 
</body> 
</html> 

あなただけの更新/フォームセクションの1つを変更したい場合は、なしこれはJavaScriptを使用して(別名Ajax)JavaScriptのポストを実行せずに行うことはできません。

+1

よろしくお願いします。その質問にもかかわらず、これは確かに私が聞きたかったものです。「フォームセクションの1つを更新/変更したい場合は、これを使用せずにはできません。 これまでのところ、asp.net mvcにいわゆるウィジェットを実装するためのきれいな方法がないようです。 :/ –

+0

これはMVCの制限ではありません。ページの一部のみを更新して、クライアント側(AJAX/JSなど)にする必要があります。 –

+0

質問に「人気の」バッジマークがあります。私がどれくらい学んだかは驚くほどです。そんなばかげた質問:D –

0
if(pass != true) 
{ 
ViewData["Message'] = "Hey your login failed!"; Return View("Login") 
} 

あなたの質問は非常に明確ではありません。

私が理解できる限り、その答えは最も可能性が高いです。ユーザーの入力に応じて、任意のものを更新できます。

+1

あなたはポイントを見逃しました。問題は、1つのフォームのみを更新する方法です。可能であれば、ViewData辞書を使用する方法ではありません。 –

+0

申し訳ありませんが、私はあなたの質問を読み続けると、私はあなたが何を求めているのか理解していません。 – Skiltz

+1

2の

要素のページでは、そのうちの1つだけをその時に更新でき、他のものには触れないのであれば私は尋ねています。 –

0

+0

私はまたあなたが尋ねていることを理解していません...いくつかの文脈を与えるために質問を編集してください。あなたの最初のフォームはひどく形成され、入力要素はありません...それは何のためですか?私はmodelviewstateがバインドしようとしたフィールドだけを更新すると思った...?それはログインウィジェットかログインページですか?または、検証メッセージと検証の強調表示に問題がありますか?私はいくつかのカスタムHTMLHelper拡張を作成して複数のフォームを処理しなければなりませんでしたが、あなたの問題が何かを理解できないので、実際にここに当てはまるかわかりません。 – Charlino

+0

本当にすみません。英語は私の母国語でもありません。私は質問を編集しようとします。 –

1

FormCollectionを受け入れ、ビューに2つのフォームが定義されている場合は、返されたformcollectionにフォームAまたはフォームBの値が設定されます。formCollectionを検査し、その中の価値。あなたは非常に明示的にしたい場合は、あなたが選択するのに役立つ値で両方のフォームで同じ隠し変数が発生する可能性があります。

これは1つのアプローチです。これに対処するにはいくつかの方法がありますが、私は確信しています。あなたは二つの異なる部分のビューを作成

:あなたは2つの単純なフォームを持っている場合

1

は、あなたがこのaproachを使用することができます。

@model CustomerInfoModel 
@using (Ajax.BeginForm("CustomerInfo", "Customer", new AjaxOptions { HttpMethod = "Post", OnBegin = "InfoLoading", OnComplete = "InfoCompleted" }, new { id = "info", @class = "form-horizontal" })) 
    { 
    <input type="text" class="form-control" name="Name" id="Name" value="@Model.Name" /> 
    <input type="email" class="form-control" name="Email" id="Email" value="@Model.Email" /> 
    <button type="submit" id="save-info" class="btn-medium red">Save</button> 
    } 

とあなたの親ビューで

@model CustomerPasswordChangeModel 
@using (Ajax.BeginForm("CustomerPasswordChange", "Customer", new AjaxOptions { HttpMethod = "Post", OnBegin = "InfoLoading", OnComplete = "InfoCompleted" }, new { id = "change", @class = "form-horizontal" })) 
{ 
<input type="password" class="form-control" name="OldPassword" id="OldPassword" value="" /> 
<input type="password" class="form-control" name="NewPassword" id="NewPassword" value="" /> 
<button type="submit" id="save-change" class="btn-medium red" autocomplete="off">Save</button> 
} 

、コントローラで

@Html.Partial("CustomerInfo", Model.CustomerInfo) 

@Html.Partial("CustomerPasswordChange", Model.CustomerPasswordChange) 

[HttpPost] 
    public ActionResult CustomerInfo([Bind(Include = "Name,Email")] CustomerInfoModel model) 
    { 
     if (ModelState.IsValid) 
      return new Json(new { success=true, message="Updated.", errors=null); 

// do you logic 

     return new Json(new { success=false, message="", errors=getHtmlContent(ModelState.Values.SelectMany(v => v.Errors).ToList(), "ModelError")); 
    } 

    [HttpPost] 
    public ActionResult CustomerPasswordChange([Bind(Include = "OldPassword,NewPassword")] CustomerPasswordChangeModel model) 
    { 
     if (ModelState.IsValid) 
      return new Json(new { success=true, message="Updated.", errors=null); 

// do you logic 

     return new Json(new { success=false, message="", errors=getHtmlContent(ModelState.Values.SelectMany(v => v.Errors).ToList(), "ModelError")); 
    } 

これは、あなたがしたいことを行います。

注:getHtmlContentメソッドは、単にページに表示するエラーメッセージを生成しています。特別なことはありません。私は必要に応じて共有することができます。