C# 正在保存System.Web.HttpPostedFileWrapper字符串,而不是文件路径名
这过去工作正常,但现在代码没有将路径名保存到C# 正在保存System.Web.HttpPostedFileWrapper字符串,而不是文件路径名,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,这过去工作正常,但现在代码没有将路径名保存到SitePlan和SiteImage字段。如果我调试一切正常,并且SitePlan和SiteImage包含上传文件的路径名(即~/UploadedFiles/20110210104108SiteImage77.jpg)。但在SitePlan和SiteImage字段中保存后,字符串值“System.Web.HttpPostedFileWrapper” 由于它保存得很好,因此正在努力解决这一问题,并且正在监视和调试保存的值是路径名,因此没有错误,所有内容都
SitePlan
和SiteImage
字段。如果我调试一切正常,并且SitePlan
和SiteImage
包含上传文件的路径名(即~/UploadedFiles/20110210104108SiteImage77.jpg)。但在SitePlan
和SiteImage
字段中保存后,字符串值“System.Web.HttpPostedFileWrapper”
由于它保存得很好,因此正在努力解决这一问题,并且正在监视和调试保存的值是路径名,因此没有错误,所有内容都正常工作,只是数据库没有路径,只有字符串“System.Web.HttpPostedFileWrapper”。非常感谢您的任何意见
这是我的控制器代码:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SiteLocationEdit(int id, FormCollection collection)
{
SiteLocation siteLocation = this._siteRepository.GetSite(Convert.ToInt16(collection["SiteId"])).SiteLocation;
if (Request.Files.Count > 0 && Request.Files["SitePlan"].ContentLength > 0)
{
DeleteFile(siteLocation.SitePlan);
siteLocation.SitePlan = SaveFile(Request.Files["SitePlan"], @"~/UploadedFiles", "SitePlan" + siteLocation.SiteId.ToString());
}
if (Request.Files.Count > 0 && Request.Files["SiteImage"].ContentLength > 0)
{
DeleteFile(siteLocation.SiteImage);
siteLocation.SiteImage = SaveFile(Request.Files["SiteImage"], @"~/UploadedFiles", "SiteImage" + siteLocation.SiteId.ToString());
}
TryUpdateModel(siteLocation);
if (!ModelState.IsValid)
return View(siteLocation);
this._siteRepository.Save(User.Identity.Name);
return RedirectToAction("SiteLocationDetails", new { id = siteLocation.SiteId });
}
protected String SaveFile(HttpPostedFileBase file, String path, string name)
{
if (file != null && file.ContentLength > 0)
{
if (path == null)
{
throw new ArgumentNullException("path cannot be null");
}
string fileType = file.FileName.Substring(file.FileName.LastIndexOf("."), file.FileName.Length - file.FileName.LastIndexOf("."));
String relpath = String.Format("{0}/{1}", path, PrefixFName(name + fileType));
try
{
file.SaveAs(Server.MapPath(relpath));
return relpath;
}
catch (HttpException e)
{
throw new ApplicationException("Cannot save uploaded file", e);
}
}
return null;
}
这是我的视图,其中包含一个局部视图(将在本文后面显示)
以下是SiteLocationCreate(),这是有效的,只是编辑没有:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SiteLocationCreate(SiteLocation siteLocation, FormCollection collection)
{
// TODO CF: Look into this line. Is there a better way to do it? I would think so.
// It uses a hidden field in the object form
Site site = this._siteRepository.GetSite(Convert.ToInt16(collection["SiteId"]));
site.SiteLocation = siteLocation;
if (Request.Files.Count > 0 && Request.Files["SitePlan"].ContentLength > 0)
{
DeleteFile(siteLocation.SitePlan);
siteLocation.SitePlan = SaveFile(Request.Files["SitePlan"], @"~/UploadedFiles", "SitePlan" + siteLocation.SiteId.ToString());
}
if (Request.Files.Count > 0 && Request.Files["SiteImage"].ContentLength > 0)
{
DeleteFile(siteLocation.SiteImage);
siteLocation.SiteImage = SaveFile(Request.Files["SiteImage"], @"~/UploadedFiles", "SiteImage" + siteLocation.SiteId.ToString());
}
if (!ModelState.IsValid)
return View(siteLocation);
this._siteRepository.Save(User.Identity.Name);
return RedirectToAction("SiteLocationDetails", new { id = site.SiteId });
}
已删除TryUpdateModel()行及其工作状态。但是必须为每个字段更新逐行指定,即siteLocation.Location=collection[“Location”];等等。由于TryUpdateModel已取出您能否显示
SaveFile()的代码
?我想这是你自己的代码。更新完成,添加了SaveFile(),加油,就是这样,这里疯了:-)奇怪的是SiteLocationCreate()工作正常,现在就发布我没有看到任何明显的会导致这种行为的东西。出于调试目的,您是否尝试过在SaveFile()
调用之前或之后设置siteLocation.SiteImage
的值,以查看数据库中保存了什么?在SaveFile()之后设置TryUpdateModel(),一旦代码移出TryUpdateModel(),它就更改了2个值,您已经弄明白了!
protected String SaveFile(HttpPostedFileBase file, String path, string name)
{
if (file != null && file.ContentLength > 0)
{
if (path == null)
{
throw new ArgumentNullException("path cannot be null");
}
string fileType = file.FileName.Substring(file.FileName.LastIndexOf("."), file.FileName.Length - file.FileName.LastIndexOf("."));
String relpath = String.Format("{0}/{1}", path, PrefixFName(name + fileType));
try
{
file.SaveAs(Server.MapPath(relpath));
return relpath;
}
catch (HttpException e)
{
throw new ApplicationException("Cannot save uploaded file", e);
}
}
return null;
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SiteLocationCreate(SiteLocation siteLocation, FormCollection collection)
{
// TODO CF: Look into this line. Is there a better way to do it? I would think so.
// It uses a hidden field in the object form
Site site = this._siteRepository.GetSite(Convert.ToInt16(collection["SiteId"]));
site.SiteLocation = siteLocation;
if (Request.Files.Count > 0 && Request.Files["SitePlan"].ContentLength > 0)
{
DeleteFile(siteLocation.SitePlan);
siteLocation.SitePlan = SaveFile(Request.Files["SitePlan"], @"~/UploadedFiles", "SitePlan" + siteLocation.SiteId.ToString());
}
if (Request.Files.Count > 0 && Request.Files["SiteImage"].ContentLength > 0)
{
DeleteFile(siteLocation.SiteImage);
siteLocation.SiteImage = SaveFile(Request.Files["SiteImage"], @"~/UploadedFiles", "SiteImage" + siteLocation.SiteId.ToString());
}
if (!ModelState.IsValid)
return View(siteLocation);
this._siteRepository.Save(User.Identity.Name);
return RedirectToAction("SiteLocationDetails", new { id = site.SiteId });
}