1

我的网站托管在 IIS7.5 我有一个控制器操作如下

[HttpPost]
    public ActionResult Create(ClientDocument clientdocument,HttpPostedFileBase FilePath)
    {
        if (ModelState.IsValid)
        {
            try
            {
                if (FilePath != null && FilePath.ContentLength > 0)
                {
                    var filename = Path.GetFileName(FilePath.FileName);
                    string ext = filename.Split(char.Parse(".")).LastOrDefault();
                    clientdocument.FilePath = clientdocument.Title + "." + ext;
                    var path = Path.Combine(Server.MapPath("~/Uploads"), clientdocument.Title + "." + ext);
                    FilePath.SaveAs(path);
                    db.ClientDocuments.Add(clientdocument);
                    db.SaveChanges();
                    return RedirectToAction("../");
                }                    
            }
            catch(Exception ex)
            {
                return HttpNotFound("There Was A Problem Uploading File And Creating A Record");
            }
        }

        ViewBag.ClientID = new SelectList(db.Clients, "ClientID", "FullName", clientdocument.ClientID);
        return View(clientdocument);
    }

当我单击按钮时,它会尝试上传文件,但随后显示以下错误消息

http 404 文件或目录未找到您要查找的资源可能已被删除、名称已更改或临时不可用

请协助如何配置 iis7.5 以上传此文件,而在 VS2010 中一切正常。

编辑

更改后@keshav 提到的视图:

    @using (Html.BeginForm("Create", "ClientDocument", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.ValidationSummary(true)
    <fieldset>
            <legend>Attach New Client Document</legend>
    <div class="editor-label">
                @Html.LabelFor(model => model.FilePath)
            </div>
            <div class="editor-field">
                <input type="file" id="FilePath" name="FilePath" />
                @Html.ValidationMessageFor(model => model.FilePath)
            </div>
   <fieldset>
}

和控制器:

[HttpPost,ActionName("Create")]
    public ActionResult Create(ClientDocument clientdocument,HttpPostedFileBase FilePath)
    {
        if (ModelState.IsValid)
        {
            try
            {
                if (FilePath != null && FilePath.ContentLength > 0)
                {
                    var filename = Path.GetFileName(FilePath.FileName);
                    string ext = filename.Split(char.Parse(".")).LastOrDefault();
                    clientdocument.FilePath = clientdocument.Title + "." + ext;
                    var path = Path.Combine(Server.MapPath("~/Uploads"), clientdocument.Title + "." + ext);
                    FilePath.SaveAs(path);
                    db.ClientDocuments.Add(clientdocument);
                    db.SaveChanges();
                    return RedirectToAction("Index", "Home");
                }                    
            }
            catch(Exception ex)
            {
                return HttpNotFound("There Was A Problem Uploading File And Creating A Record");
            }
        }

        ViewBag.ClientID = new SelectList(db.Clients, "ClientID", "FullName", clientdocument.ClientID);
        return View(clientdocument);
    }

我仍然遇到和以前一样的问题。

4

4 回答 4

2

404 错误意味着您试图在服务器上请求一个不存在的 url。您还没有显示您的视图的外观,但我怀疑您有一些硬编码的 url,并且您没有使用 url 助手来生成表单。因此,这是生成指向此控制器操作的表单的正确方法:

@using (Html.BeginForm("Create", null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    ...
}

另一个问题在于您的控制器操作。以下是错误的:

return RedirectToAction("../");

RedirectToAction 方法需要一个操作名称,而不是您提供的 url。因此,请确保您已经传递了一个动作名称(如果动作位于不同的控制器上,则传递一个可选的控制器名称):

return RedirectToAction("Index", "Home");

如果在您返回的文件上传处理过程中出现异常,也会在您的创建控制器操作HttpNotFound中导致客户端出现 404 错误。因此,请确保此代码不会引发异常。您也可以记录错误,而不是简单地重定向,以便能够确定出了什么问题。

于 2012-05-12T09:52:03.747 回答
0

我想你忘记了上传之后的 /

var path = Path.Combine(Server.MapPath("~/Uploads/"), clientdocument.Title + "." + ext);

于 2012-05-12T03:18:47.230 回答
0

发布应用程序后会发生这种情况吗?如果是这样,上传文件夹很可能没有被复制。除非您更改发布设置以包含所有文件,否则 Vs2010 不会发布自定义文件夹。或者您可以浏览站点位置并自己创建文件夹

编辑

我有一个类似设置的应用程序,似乎工作正常。我注意到的唯一区别在于 html.begin。我明确指定了动作和控制器。

我的观点

@using (Html.BeginForm("Upload", "Administrator", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.ValidationSummary(true, "File upload was unsuccessful. Please correct the errors and try again.")
    <input type="file" name="FileUpload1" />
    <input type="submit" name="Submit" id="Submit" value="Upload" onclick="return confirm('Doing this will override any previous data. Are you sure you want to proceed?')"/>
}

我的控制器:

[HttpPost, ActionName("Upload")]
public ActionResult UploadPost()
{
  // my code
}

尝试指定您的操作和控制器,看看是否有帮助。

于 2012-05-12T04:43:04.657 回答
0

据我所知,您不必更改 IIS 中的任何设置......进一步了解@Darin Dimitrov 关于异常的说法,您可以将 catch 子句中的代码更改为:

catch(Exception ex)
{
        ViewBag.errorMessage = ex.Message;
        return View("Error");
}

并在您的错误页面(共享视图文件夹下应该有一个)添加以下行

@ViewBag.errorMessage

我认为代码在服务器上引发了一些异常,但在本地运行时却没有。这将帮助您缩小问题范围。如果您仍然收到 404 错误,则可能是设置问题。

于 2012-05-13T05:35:44.850 回答