【问题标题】:MVC 4 Route mapping isn't workingMVC 4 路由映射不起作用
【发布时间】:2014-05-28 20:19:22
【问题描述】:

我有一个最近添加了文件附件功能的网站;然而,剑道.SaveUrl() 似乎没有“看到”控制器!我已经验证所有文件路径都是正确的。我在默认映射语句之前添加了自定义映射...浏览器不是问题,我尝试过 IE、Chrome、FireFox 和 Safari,同样的错误。请帮忙!

错误:

System.Web.HttpException (0x80004005): The controller for path '/Shared/RepairAttachment' was not found or does not implement IController.

Global.asax.cs 中的地图:

        routes.MapRoute(
            name: "/Shared/RepairAttachment",
            url: "Controllers/RepairAttachmentsController/{Save}/{IEnumerable<HttpPostedFileBase>}",
            defaults: new { controller = "RepairAttachmentsController", action = "Save", attachments = UrlParameter.Optional });

文件上传器代码:

    @(Html.Kendo().Upload()
        .ShowFileList(true)
        .Async(async => async
            .SaveUrl("SharedRepairAttachment")
        )
        .Name("frmUploadController")
        .Multiple(true)
        .Events(events => events
            .Complete("onRepairAttachmentUploadComplete")
            .Error("onRepairAttachmentUploadError")
        )
    )

控制器(部分):

public class RepairAttachmentsController : Controller
{
    [HttpPost]
    [HttpOptions]
    public ActionResult Save(IEnumerable<HttpPostedFileBase> attachments)
    {
        try
        {
            HarbisonFischerDBEntities db = new HarbisonFischerDBEntities();
            foreach (var file in attachments)
            {
                Repair r = db.Repairs.Find(ViewBag.RepairID);
                // Each Customer and repair gets their own folder
                string srvrpath = Path.Combine(ConfigurationManager.AppSettings["ServerPathForFiles"].ToString(), r.CustomerLocation.Customer.OracleName);
                srvrpath = Path.Combine(srvrpath, r.RepairID.ToString());
                if (Directory.Exists(srvrpath) == false) { Directory.CreateDirectory(srvrpath); }

                string fileName = Path.GetFileName(file.FileName);  // Some browsers send file names with full path; we only care about the file name.
                string destinationPath = Path.Combine(Server.MapPath(srvrpath), fileName);
                file.SaveAs(destinationPath);

                RepairAttachment ra = new RepairAttachment();
                ra.FileName = file.FileName;
                ra.Title = Path.GetFileNameWithoutExtension(file.FileName);
                ra.RepairID = ViewBag.RepairID;
                db.RepairAttachments.Add(ra);
                db.SaveChanges();                
            }
        }
        catch (Exception ex)
        {
            Logic.ExceptionLogging.LogException("RepairAttachmentsController", ex, null, null);
            return Json(new { status = "Upload Failed: " + ex.Message }, "text/plain");
        }
        return Json(new { status = "Upload succeeded." }, "text/plain");
    }

【问题讨论】:

  • 错误是/Shared/RepairAttachment,不应该是/Shared/RepairAttachments吗?
  • 您的 Url 格式很有趣...从未见过“{IEnumerable}”作为参数 - 不确定它如何/是否有效...请注意,您的示例未显示匹配的路线“ /Shared/RepairAttachment" url - 考虑添加到帖子中。

标签: c# asp.net-mvc asp.net-mvc-4 routes


【解决方案1】:

我不知道剑道,但我很难认为这会奏效:

routes.MapRoute(
            name: "/Shared/RepairAttachment",
            url: "Controllers/RepairAttachmentsController/{Save}/{IEnumerable<HttpPostedFileBase>}",
            defaults: new { controller = "RepairAttachmentsController", action = "Save", attachments = UrlParameter.Optional });

如果您向“/Shared/RepairAttachment”发送请求,url 参数中的模式应与此匹配。所以,我希望你需要类似的东西

routes.MapRoute(
            name: "RepairAttachment",
            url: "/Shared/RepairAttachment",
            defaults: new { controller = "RepairAttachments", action = "Save", attachments = UrlParameter.Optional });

注意我的方式

  • 更改了url 参数的值以匹配传入的请求
  • 从“RepairAttachmentsController”中删除了“Controller”,因为除非您的控制器名为“RepairAttachmentsControllerController”,否则不需要它
  • 完全删除了“{IEnumerable...}”内容。我知道您正试图告诉 MVC 您将发送一组文件,但您没有在这里声明。 MVC's model binding features 会自行解决,因为您的操作方法需要一个 IEnumerable&lt;HttpPostedFileBase&gt; attachments 参数。

【讨论】:

  • Rune,我相信你已经解决了我的路由问题!我仍然收到错误,但代码至少找到了正确的文件。我必须弄清楚原因:System.Web.HttpException (0x80004005):在控制器“HarbisonFischer.Web.Controllers.RepairAttachmentsController”上找不到公共操作方法“Save”。
  • 通过在操作方法上同时使用 [HttpPost] 和 [HttpOptions],您需要请求是 POST 请求和 OPTIONS 请求,但它不可能同时是两者,因此操作将永远不会被认为是有效的。尝试删除这些属性。
  • 这太奇怪了...如果我将 [HttpPost] 和 [HttpOptions] 完全删除,则错误变为: System.Web.HttpException (0x80004005): A public action method 'Index' was在控制器上找不到...然而,很明显,Index() 就在那里。如果我添加 [HttpGet] 或 [HttpPost],则无法看到 Save()。
  • 顺便说一句,根据 Kendo 文档,我确信 Save() 需要是 [HttpPost]...
  • 好的,根据我上一篇文章... 不相关的错误,我没有仔细阅读;我的坏完全。感谢所有发帖的人! Rune,如果允许的话,我会支持你的回复。 :-)
猜你喜欢
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
相关资源
最近更新 更多