在ASP.NET-MVC中使用AJAX创建新记录

时间:2010-03-26 16:59:42

标签: asp.net-mvc ajax jquery

我正在最困难的时候绕过这个。我最近问了这个问题Create/Edit/Save data in a jQuery pop-up for ASP.NET-MVC and Linq2Sql我确信响应是正确的方法,但我无法弄清楚如何编写后端代码以使其工作。我最初通过遵循nerddinner教程创建了我的网站。我有一个subcontracts模型和一个subcontracts控制器。在我的转包入口页面上,我希望有一个弹出/对话框,如果公司不在下拉列表中,用户可以进入新公司。我需要创建一个新的公司控制器吗?我不会有公司模型b / c公司表链接到分包合同dbml中的我的分包合同表。

有人能指点我某个地方的例子吗?或提供任何帮助。

修改 调用company / create方法时,所有字段都为null。

以下是代码:

<div id="popupCreateCompany" title="Create a new company"> 
    <p>  
        <label for="company_name">Company Name:</label><br />
        <%= Html.TextBox("company_name") %>    
    </p>
    <p>
        <label for="company_desc">Company Description:</label><br />
        <%= Html.TextBox("company_desc") %>
    </p>  
    <p>
        <label for="address">Address:</label><br />
        <%= Html.TextBox("address") %>
    </p>
    <p>
        <label for="city">City:</label><br />
        <%= Html.TextBox("city") %>
    </p>
    <p>
        <label for="state">State:</label><br />
        <%= Html.TextBox("state") %>
    </p>
    <p>
        <label for="zip">Zip:</label><br />
        <%= Html.TextBox("zip") %>
    </p>
    <p>
        <label for="website">Website:</label><br />
        <%= Html.TextBox("website") %>
    </p>
 </div>  

jquery代码:

            $("#create-company").click(function() {
            //centerPopup();
            //loadPopup();
            $('#popupCreateCompany').dialog(
                {
                    modal: true,
                    buttons:
                    {
                        'Add': function() {
                            var dialog = $(this);
                            var form = $(this).find('#popupCreateCompany');
                            $.post('/company/create', $(form).serialize(), function() {
                                dialog.dialog('destroy');
                            })
                        },
                        'Cancel': function() {
                            dialog.dialog('destroy');
                        }
                    }
                });

        });

此外,我的字段显示为对话框顶部的单独框。 alt text http://i39.tinypic.com/2hhg4kh.jpg

2 个答案:

答案 0 :(得分:3)

您无需创建新控制器。通过jQuery提交表单与通过鼠标单击按钮提交表单没有什么不同。

上一个答案的代码:

$.post('/company/new', $(form).serialize(), function() {
                            dialog.dialog('destroy');
                        }

将在POST请求中发布表单的每个字段,就像平常一样。如果您将表单字段命名为表示对象的属性,因此可以像平常一样绑定到模型对象,则可以像平常一样创建操作方法:

public ActionResult New(CompanyDetails newCompany)
{
    if (ModelState.IsValid)
    {
       // Insert newCompany into database.
    }
}

您也可以使用FormCollection参数,并使用TryUpdateModel()填充您创建的某个对象:

public ActionResult New(FormCollection postedValues)
{
    // Create a new Company() here and just call TryUpdateModel() on it:
    var company = new Company();
    TryUpdateModel(company);
    if (ModelState.IsValid)
    {
        /// Insert
    }
}

如果由于某种原因您的表单字段无法与对象属性匹配,那么您可以采用“手动”方式,只需在FormCollection参数中搜索所需的字段数据,并执行业务逻辑以构建新公司发布的值。

一旦你完成公司的创建,你必须记住通过ajax调用了action方法,并且它是一个将处理响应的jQuery回调。您可能希望返回仅指示成功或失败的JsonResult,只需关闭对话框,或返回jQuery回调将作为html数据处理的完整视图并显示在对话框中。

答案 1 :(得分:2)

我在上一个问题的回答中使用的网址只是一个例子。您可以轻松地在现有控制器上创建一个创建新公司的方法。至于没有公司“模型” - 我会认为你已经有了一个。它与您的分包合同处于相同的数据环境中 - 也许,您的意思是您没有公司存储库。

根据您构建存储库的方式,您可能需要也可能不需要公司模型的单独存储库。如果您正在为每个模型模式(强类型存储库)使用存储库,那么当您直接与公司打交道时,您会需要一个单独的存储库。如果您使用每个存储库模式的多个模型(强类型方法),那么您可能不需要另一个模型。

无论如何,您需要在某些控制器上使用 方法来处理创建公司的问题。我可能会选择一个独立的公司控制人员,因为您可能还希望能够事先创建新公司而不考虑任何特定合同。如果最终需要扩展应用程序,Uinsg将单独的控制器隔离处理它们的逻辑,从而减少与子转包类的耦合。