gpt4 book ai didi

c# - 在带有部分 View 的 jQuery 对话框中上传文件

转载 作者:行者123 更新时间:2023-12-02 22:44:08 27 4
gpt4 key购买 nike

我有一个页面,您可以在其中编辑客户。在此页面上,您还可以为客户上传文件。您单击一个按钮,一个 jQuery 对话框打开,您上传一个文件,然后单击保存。

这是我的/Clients/Edit View :

<script type="text/javascript" language="javascript">

$(document).ready(function () {

// add file click event
$("a#addFile").click(function () {
$.ajax({
url: '@Url.Content("/ClientFiles/Create/")' + @Model.ClientId,
context: document.body,
success: function (data) {
// open dialog with Create partial view data
$("#dialog-add").html(data).dialog("open");
}
});

return false;
});


// add file dialog settings
$("#dialog-add").dialog({
modal: true,
buttons: {
"Save": function () {
$.validator.unobtrusive.parse("#AddFileForm");
if ($("#AddFileForm").valid()) {
$.post("/ClientFiles/Create", $("#AddFileForm").serialize(),
function (data) {
$("#dialog-add").dialog("close"); // close dialog
});
}
}
}
});
});

</script>

@using (Html.BeginForm("Edit", "Clients", FormMethod.Post))
{
@Html.HiddenFor(m => m.ClientId)

<a id="addFile">Add a new file</a>
<div id="dialog-add" title="" style="display:none"></div>

<input type="submit" value="Save" />
}

这是我的/ClientFiles/Create 部分 View :

@model Models.ClientFileViewModel

@using (Html.BeginForm("Create", "ClientFiles", FormMethod.Post, new { @id = "AddFileForm", enctype = "multipart/form-data" }))
{
@Html.ValidationSummary(true)

@Html.HiddenFor(model => model.ClientId)
@Html.TextBoxFor(model => model.ModelFile, new { type = "file" })

@Html.ValidationSummary()
}

这是我的 ClientFileViewModel:

public class ClientFileViewModel
{
[ScaffoldColumn(false)]
public int ClientFileId { get; set; }

public int ClientId { get; set; }
public HttpPostedFile ModelFile { get; set; }
}

最后,我的 ClientFilesController 方法:

public ActionResult Create(int id)
{
return PartialView(new ClientFileViewModel { ClientId = id } );
}

public JsonResult Create(ClientFileViewModel viewModel)
{
if (ModelState.IsValid)
{
if (viewModel.ModelFile != null)
{
// upload file here
}
}

return Json(new { success = true });
}

所以一切正常,直到我发布到 Create(ClientFileViewModel viewModel)。当我通过调试器时, View 模型包含 ClientId,但 ModelFile 为空。

我是否做错了什么导致文件无法通过 View 模型传递?

最佳答案

您应该使用基类 (HttpPostedFileBase),即替换:

public HttpPostedFile ModelFile { get; set; }

与:

public HttpPostedFileBase ModelFile { get; set; }

在你的 View 模型中。


话虽这么说,但这只是您问题的一半。您似乎正在使用 AJAX 请求来提交表单:

$.post("/ClientFiles/Create", $("#AddFileForm").serialize(),

您不能使用 AJAX 将文件上传到服务器。您可以使用一些插件,例如 jquery.form支持 file input fields并生成一个隐藏的 iframe 来规避此限制。因此,如果您决定使用该插件,您可以执行以下操作以对其进行 AJAX 化:

"Save": function () {
$.validator.unobtrusive.parse("#AddFileForm");
if ($("#AddFileForm").valid()) {
$("#AddFileForm").ajaxSubmit(function() {
$("#dialog-add").dialog("close");
});
}
}

其他允许您上传文件的流行插件是 Uploadify , Blueimp File Upload , Ajax Upload , ...

关于c# - 在带有部分 View 的 jQuery 对话框中上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10302900/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com