ASP.NET MVC - Ajax.BeginForm与Ajax.ActionLink

时间:2011-09-12 15:50:40

标签: asp.net-mvc asp.net-ajax

我注意到当我使用Ajax.BeginForm(带有提交按钮)时,模型被传递给Controller但是当我使用Ajax.ActionLink时它没有被传递 - 或者至少我还没有发现如何点击进入它。

第一个问题:您如何确定哪条路线更好?

现在,为了更深入地了解一个示例场景:我有一个具有几十个简单数据类型属性和一些List属性的模型。使用Html.BeginForm()呈现创建/编辑视图。提交按钮返回整个视图模型,然后我可以浏览它并通过数据库模型将所有数据保存到数据库。就像我说的,我也有一些List作品。例如,我有一个接受的信用卡列表,我将其呈现为一系列复选框,提供的服务列表也呈现为复选框列表。所有这些都很容易在Form Post上处理。但是,我有一个List基本上是一个自由格式的文本条目,我希望文本框中有一个Add按钮,后跟所有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>

部分视图如下所示:

&lt;%@ Control Language =“C#”Inherits =“System.Web.Mvc.ViewUserControl”%&gt; &lt;%@ Import namespace =“RainWorx.FrameWorx.MVC”%&gt;

                                     

&lt;%foreach(Model.MyLicenses中的var许可证){%&gt;

                                     

&lt;%}%&gt;

我用这种方式设置它的思路非常简单(我认为无论如何)。我只在License部分有一些Ajax。我想在不丢失主模型的所有信息的情况下添加一个接一个的字符串。添加完成后,我想用更新后的List更新部分视图。

这可能是一种更好的方法来做到这一点,如果是这样,把它放在我身上。我现在(并且很快)想要弄清楚的主要部分是Ajax.ActionLink(以及我的扩展方法)是否是正确的方向。

1 个答案:

答案 0 :(得分:1)

Ajax.BeginForm只是简化了给定的表单,当你提交它时,它包含的所有输入字段的值都被发送到服务器。与普通形式的唯一区别是它们是使用AJAX发送的。

另一方面,Ajax.ActionLink生成一个简单的锚标记,它对给定的URL执行AJAX请求。除非您指定,否则它不会向服务器发送任何其他值。

  

您如何确定哪条路线更好?

就我个人而言,我不使用任何这些。我使用标准的Html.BeginForm和Html.ActionLink手动编写代码,用jQuery不引人注意地进行AJAXify(如果我当然需要使用Ajax)。

对于实施动态列表编辑的方案,您可以查看following blog post