2011-09-12 72 views
2

我注意到當我使用Ajax.BeginForm(帶有一個提交按鈕)時,Model被傳遞給Controller,但是當我使用Ajax.ActionLink時,它不是通過了 - 或者至少我還沒有發現如何挖掘它。ASP.NET MVC - Ajax.BeginForm vs Ajax.ActionLink

第一個問題:你如何確定哪條路線更好?

現在,深入一個示例場景:我有一個具有幾十個簡單數據類型屬性和幾個List屬性的模型。創建/編輯視圖使用Html.BeginForm()進行渲染。提交按鈕返回整個視圖模型,然後我可以通過它並通過數據庫模型將所有數據保存到數據庫。就像我說的,我也有幾個List。例如,我接受了一系列信用卡列表,我將其呈現爲一系列複選框,提供的服務列表也顯示爲複選框列表。所有這些都很容易在Form Post上處理。但是,我有一個基本上是自由格式文本輸入的列表,我希望文本框具有添加按鈕,後面是所有列表項,每個列表項都有一個刪除按鈕。

我創建/編輯視圖看起來類似:

<%@ 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的一些東西。我想添加一個接一個的字符串而不會丟失主模型的所有信息。添加完成後,我想用它的更新列表更新分部視圖。

可能有更好的方法來做到這一點比我的佈局,如果是的話,躺在我身上。我現在試圖弄清楚的主要部分(並且很快)是Ajax.ActionLink(以及我的擴展方法)是否是正確的方向。

回答

1

Ajax.BeginForm簡單地對給定的表單進行Ajax化,並且當您提交它時,它所包含的所有輸入字段的值將被髮送到服務器。與正常形式唯一的區別是它們使用AJAX發送。

另一方面,Ajax.ActionLink生成一個簡單的錨定標記,對給定的url執行AJAX請求。除非您指定它,否則它不會向服務器發送任何附加值。

你如何確定哪個更好的路線?

我個人並不使用任何這些。我使用標準的Html.BeginForm和Html.ActionLink,並手動編寫代碼,用jQuery(如果我需要使用Ajax當然)不顯眼地AJAXify它們。您可以查看following blog post

+1

你有一個例子,它是手動完成而不是幫助者的方式?還有你爲什麼不喜歡使用助手的原因? – Ciwan