我正在创建一个 MVC 网站,它利用弹出窗口的部分视图来处理我所有的 CRUD 事务。请注意,我的应用程序已经可以完美地处理这些 CRUD 操作(LINQ-To-Entity)。但是,我的弹出表单有问题。
以下是我的代码_Add.cshtml
:
@model MyStore.Models.MyModels.ProductsModel
@{
Layout = null;
}
@using (Ajax.BeginForm("_Add", "Products", new AjaxOptions
{
InsertionMode = InsertionMode.Replace,
HttpMethod = "POST",
OnSuccess = "addSuccess"
}, new { @id = "addForm" }))
{
@Html.ValidationSummary(true)
<div id="add-message" class="error invisible"></div>
<fieldset>
<legend>Products</legend>
@Html.HiddenFor(m => Model.ProductCode)
<div class="editor-label">
@Html.LabelFor(model => model.ProductName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ProductName)
@Html.ValidationMessageFor(model => model.ProductName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Price)
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.Price)
@Html.ValidationMessageFor(model => model.Price)
</div>
</fieldset>
}
以下是我的代码Controller
:
[HttpGet]
public ActionResult _Add(string productCode)
{
ProductsModel model = newProductsModel();
model.ProductCode = ProductCode ;
return PartialView(model);
}
[HttpPost]
public JsonResult _Add(ProductsModel model)
{
if (ModelState.IsValid)
{
ProductsManager prod = new ProductsManager();
Products pa = new Products();
pa.ProductCode = model.ProductCode;
pa.ProductName = model.ProductName;
pa.Price = model.Price;
prod.AddProduct(pa);
return Json(HelperClass.SuccessResponse(pa), JsonRequestBehavior.AllowGet);
}
else
{
return Json(HelperClass.ErrorResponse("Please review your form"), JsonRequestBehavior.DenyGet);
}
}
请注意,_Add.cshtml
这是通过我在互联网上找到的 Popup.js 呈现的部分视图。它通过以下代码呈现:
@Html.ActionLink("[Add Product]", "_Add", new { ProductCode = @ViewData["ProductCode"] }, new { @class = "editLink" })
这工作正常。我的意思是它将产品添加到我的数据库中。但我的问题是在单击Proceed
按钮时,我从页面中得到这个弹出下载对话框:
有人可以帮我吗?我有一种预感,这是因为HttpMethod
我正在使用(POST、PUT、GET、DELETE),但我不确定哪个是正确的,或者它是否真的是问题所在。
任何帮助将不胜感激!PS。对不起,很长的帖子。
编辑:
这是我为这个项目遵循的教程:http ://ricardocovo.com/2012/04/06/asp-mvc3-editing-records-with-jqueryui-dialogs-and-ajaxforms-razor-version/
编辑:
下面是我正在使用的 jscript 代码。它与我遵循的教程中的基本相同。我只需要在最后一种方法上注释掉几行。
另外,我正在使用 MVC 4。希望这会有所帮助!谢谢!
var linkObj;
$(function () {
$(".addLink").button();
$('#addDialog').dialog({
autoOpen: false,
width: 400,
resizable: false,
modal: true,
buttons: {
"Update": function () {
$("#add-message").html(''); //make sure there is nothing on the message before we continue
$("#addForm").submit();
},
"Cancel": function () {
$(this).dialog("close");
}
}
});
$(".addLink").click(function () {
//change the title of the dialog
linkObj = $(this);
var dialogDiv = $('#addDialog');
var viewUrl = linkObj.attr('href');
$.get(viewUrl, function (data) {
dialogDiv.html(data);
//validation
var $form = $("#addForm");
// Unbind existing validation
$form.unbind();
$form.data("validator", null);
// Check document for changes
//$.validator.unobtrusive.parse(document);
// Re add validation with changes
//$form.validate($form.data("unobtrusiveValidation").options);
//open dialog
dialogDiv.dialog('open');
});
return false;
});
});
function addSuccess(data) {
if (data.Success == true) {
//we update the table's info
//var parent = linkObj.closest("tr");
//parent.find(".carName").html(data.Object.Name);
//parent.find(".carDescription").html(data.Object.Description);
//now we can close the dialog
$('#addDialog').dialog('close');
//twitter type notification
$('#commonMessage').html("Add Complete");
$('#commonMessage').delay(400).slideDown(400).delay(3000).slideUp(400);
}
else {
$("#add-message").html(data.ErrorMessage);
$("#add-message").show();
}
}
我注释掉了这两行:
$.validator.unobtrusive.parse(document);
$form.validate($form.data("unobtrusiveValidation").options);
因为不评论它们会在运行时给我以下错误:
这使我认为这个问题是由于不显眼的验证造成的。就像下面 Xnake 发布的链接一样,我也遇到了同样的问题。唯一不同的是,Thread Opener 必须在他的 Web.config 文件上禁用不显眼的验证来解决问题,而我不能这样做,因为我的代码正在使用不显眼的验证。
非常感谢您提供任何帮助。非常感谢你!