2011-09-12 20 views
2

モデルがコントローラに渡されるAjax.BeginForm(サブミットボタン付き)を使用したときに気付いたことがありますが、Ajax.ActionLinkを使用するとそうではありません渡された - 少なくとも私はそれを活用する方法を発見していない。ASP.NET MVC - Ajax.BeginForm vs Ajax.ActionLink

最初の質問:どちらが良いルートを決定するのですか?

ここで、1つのサンプルシナリオを少し深めてみましょう:数十のシンプルなデータ型プロパティといくつかのリストプロパティを持つモデルがあります。 Create/Editビューは、Html.BeginForm()でレンダリングされます。サブミットボタンはビューモデル全体を返します。そして、DBモデルを介してすべてのデータをDBに保存します。私が言ったように、私はリストの作品もいくつか持っています。たとえば、私は一連のチェックボックスとしてレンダリングするクレジットカードのリストを受け取り、提供されるサービスのリストはチェックボックスのリストとしてレンダリングされます。これらはすべてフォーム・ポストで取り扱いが簡単です。しかし、私は基本的にフリーフォームのテキストエントリであるListを1つ持っており、Addボタンの後ろにDeleteボタンが付いたListアイテムが続くテキストボックスを持っていたいと思っています。

は/編集ビューを作成マイ何かのようになります。部分的なビューが見えます

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<RainWorx.FrameWorx.MVC.ViewModels.DirectoryEdit>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server"> 
    <div class="Column12"> 
     <div class="Shadow"></div> 
     <h2 class="h2row"><%= Model.PageTitle%></h2> 
     </div> 
    <% using (Html.BeginForm()) 
     {%> 
     <%: Html.ValidationSummary(true)%> 

     <fieldset> 
      <%--<legend>Fields</legend>--%> 

      <div class="editor-label"> 
       <%: Html.LabelFor(model => model.Name)%> 
      </div> 
      <div class="editor-field"> 
       <%: Html.TextBoxFor(model => model.Name, new { style = "width:20em;" })%> 
       <%: Html.ValidationMessageFor(model => model.Name)%> 
      </div> 

      <div class="editor-label"> 
       <%: Html.LabelFor(model => model.Address1)%> 
      </div> 
      <div class="editor-field"> 
       <%: Html.TextBoxFor(model => model.Address1, new { style = "width:20em;" })%> 
       <%: Html.ValidationMessageFor(model => model.Address1)%> 
      </div> 
...     

      <div class="editor-label"> 
       <%: Html.LabelFor(model => model.LookupAccepts)%> 
      </div> 
      <div class="editor-field"> 
       <hr /> 
       <% foreach (var a in Model.MyAccepts) 
        { 
         if (a.Checked) 
         { %> 
         <input type="checkbox" name="AcceptIDs" checked="checked" value="<%: a.ID %>" /> <%: a.Name%><br /> 
        <% } 
         else 
         { %>      
         <input type="checkbox" name="AcceptIDs" value="<%: a.ID %>" /> <%: a.Name%><br /> 
       <% } 
        } %> 
      </div> 

      <div class="editor-label"> 
       <%: Html.LabelFor(model => model.LookupServices)%> 
      </div> 
      <div class="editor-field"> 
       <hr /> 
       <% foreach (var a in Model.MyServices) 
        { 
         if (a.Checked) 
         { %> 
         <input type="checkbox" name="ServiceIDs" checked="checked" value="<%: a.ID %>" /> <%: a.Name%><br /> 
        <% } 
         else 
         { %>      
         <input type="checkbox" name="ServiceIDs" value="<%: a.ID %>" /> <%: a.Name%><br /> 
       <% } 
        } %> 
      </div> 

      <div class="editor-label"> 
       <%: Html.LabelFor(model => model.MyLicenses)%> 
      </div> 
      <div class="editor-field"> 
       <hr /> 
       <% Html.RenderPartial("EditLicense", model: Model); %> 
      </div> 

      <div class="editor-label"> 
       &nbsp; 
      </div> 
      <div class="editor-field"> 
       <input type="submit" value="Save" /> 
      </div> 
     </fieldset> 

    <% } %> 
    </div> 

    <div> 
     <%: Html.ActionLink("Back to List", "Index")%> 
    </div> 

</asp:Content> 

のような:制御言語= "C#の" 継承= "System.Web.Mvc.ViewUserControl" @

<% %> <% @インポート名前空間= "RainWorx.FrameWorx.MVC" %>

<%ますforeach(Model.MyLicenses中のvarライセンス){%>

<%}%>

この方法でそれを設定するための私の思考の列車かなりストレートです(私はそれがとにかくだと思います)。私はAjaxにライセンス・セクションで何かしかありません。メインモデルのすべての情報を失うことなく、別の文字列を追加したい。そして、追加が完了したら、部分ビューを更新されたListで更新したいと思います。

これを行うには、私がレイアウトしたものよりも良い方法があります。そうであれば、私の上に置いてください。私が今すぐ(そしてすぐに)把握しようとしている主な部分は、Ajax.ActionLink(およびそれに対する私の拡張メソッド)が正しい方向であるかどうかです。

答えて

1

Ajax.BeginFormは指定されたフォームを単純にajaxifyし、それを送信すると、それに含まれるすべての入力フィールドの値がサーバーに送信されます。通常のフォームとの唯一の違いは、それらがAJAXを使用して送信されることです。

一方、Ajax.ActionLinkは、指定されたURLに対してAJAXリクエストを実行する単純なアンカータグを生成します。指定しない限り、サーバーに追加の値は送信されません。

どちらの方が良いルートを決定しますか?

私は個人的に私はそれらを使用しません。私は標準のHtml.BeginFormとHtml.ActionLinkを使用して、コードをjQueryと控えめにAJAXifyするように手動で記述します(もちろんAjaxを使用する必要がある場合)。

ダイナミックリスト編集を実装するシナリオでは、following blog postをご覧ください。

+1

ヘルパーの代わりに手作業で行う例がありますか?また、ヘルパーの使用が気に入らない理由は何ですか? – Ciwan

関連する問題