我正在最困难的时候绕过这个。我最近问了这个问题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
答案 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将单独的控制器隔离处理它们的逻辑,从而减少与子转包类的耦合。