有点落后于问题以及我正在努力做的事情。我基本上有一个表格,可以在我的 viewModel 中放置数据。问题是,假设客户公司在一个地址,但联系人在另一个地址我希望用户能够点击他们正在填写的主表单上的单选按钮,输入联系人不同的地址和将其保存到我在主窗体上的模型中。
我有一个控制器,它执行以下操作:
[HttpPost]
public ActionResult Edit(ClientModel client)
{
Domain.Data.EFDbContext context = new Domain.Data.EFDbContext();
if (ModelState.IsValid)
{
client.ClientAddress.AddressTypeId = client.AddressType.AddressTypeId;
client.Contact.ContactTypeId = client.ContactType.ContactTypeID;
//Add the address to the ContactAddress table and Contact ID
if (client.ContactAddress.AddressLine1 != null)
{
client.Contact.ContactAddress.Add(client.ContactAddress);
context.Contacts.Add(client.Contact);
}
else
{
client.ContactAddress = client.ClientAddress;
}
client.Company.Address.Add(client.ContactAddress);
client.Company.CompanyContact.Add(client.Contact);
//The attachment to Client is created on a Trigger in the database when a new Company is added
context.Companies.Add(client.Company);
context.SaveChanges();
return RedirectToAction("Index");
}
else
{
return View(client);
}
}
这工作正常,它更新我的数据库表并保存结果,但我已经添加到 client.ContactAddress 部分,所以如果它知道我的表单中的一个字段是空的,它只会将公司地址分配给客户所在的位置并保存在相关领域。(但这不是问题,只是背景)
我试图在控制器中创建一个 partialView
[HttpGet]
public PartialViewResult AddressPartial()
{
return PartialView("_AddressPartial");
}
在我的edit.aspx中我有
$(document).ready(function () {
$('#Not_Contact_Address').click(function (e) {
if ($('#Not_Contact_Address').is(':checked')) {
$('#dialog').dialog({
autoOpen: false,
width: 400,
resizable: false,
title: 'Add Address',
modal: true,
open: function(event, ui) {
//Load the AddressPartial action which will return
// the partial view _AddressPartial
$(this).load("@Url.Action("AddressPartial")");
},
buttons: {
"Save": function() {
$('#dialog').dialog('close');
},
"Cancel": function () {
$('#dialog').dialog('close');
}
}
});
$('#dialog').dialog('open');
}
});
});
基本上,用户选择一个单选按钮,弹出一个添加地址对话框,我希望用户添加该信息,然后将该信息显示在所选单选按钮下方的表单上,然后他们可以继续,一旦完成点击提交按钮并立即将所有信息保存到数据库中。(如上面的控制器所示)。
<fieldset>
<legend>Main Contact Details</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Contact.Title)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Contact.Title)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Contact.FirstName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Contact.FirstName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Contact.LastName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Contact.LastName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Contact.Email)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Contact.Email)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Contact.Phone)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Contact.Phone)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Contact.Mobile)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Contact.Mobile)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.ContactType.Name)
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.ContactType.ContactTypeID, Model.ContactSelectList, " --- Select One --- ", null)
</div>
<b>Contact Address</b> same as <b>Company Address</b> @Html.RadioButton("Not_Contact_Address", "Yes") Yes @Html.RadioButton("Not_Contact_Address", "No") No
</fieldset>
问题
我可以打开对话框,这很好,但我无法取消对话框,我单击右上角的 x,然后这会清空我的整个表单并留下空白页,而不是我想要的。
拥有表单的最佳方式是什么,以便用户可以在表单上输入信息,在页面内显示另一个表单以添加地址并将其保存到我拥有的 viewModel 中,然后允许用户继续。
更新
function openProductEditDialog() {
$("#ProductDetailsDialogDiv").html("");
$.ajax({
type: "GET",
url: encodeURI('@Url.Action("AddressPartial", "Home")'),
cache: false,
dataType: 'html',
error: function (XMLHttpRequest, textStatus, errorThrown) {
$("#ProductEditDialogDiv").html(XMLHttpRequest.responseText);
},
success: function (data, textStatus, XMLHttpRequest) {
$("#ProductEditDialogDiv").html(data);
},
complete: function (XMLHttpRequest, textStatus) {
$('#ProductEditDialogDiv').dialog({
width: '500px',
modal: true
});
}
});
}
这使我现在可以将信息保存在新窗口中并返回到我的屏幕,任何想法都知道如何将这个 viewModel 保存在主页上。我希望将 AddressPartial 放入调用它的 CreateClient 页面上的 viewModel 中,这样他们就可以继续使用表单而不会丢失任何信息。
我猜我应该将它指向控制器并告诉它将带有 ContactAddress 的 viewModel 重新发送回 CreateClient 页面。目前正在处理这个问题。