在尝试提交带有文件上传/多个文件上传/表单字段/复选框的表单时,我收到上述错误。我在SO上经历了各种资源但无法确定问题。这是我的堆栈跟踪:
[ArgumentException: An item with the same key has already been added.]
System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) +52
System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) +10925834
System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value) +10
System.Collections.Generic.CollectionExtensions.ToDictionaryFast(TValue[] array, Func`2 keySelector, IEqualityComparer`1 comparer) +209
System.Web.Mvc.ModelBindingContext.get_PropertyMetadata() +201
System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) +387
System.Web.Mvc.DefaultModelBinder.BindProperties(ControllerContext controllerContext, ModelBindingContext bindingContext) +180
System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Object model) +106
System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +2541
System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +633
System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +494
System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +199
System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__19(AsyncCallback asyncCallback, Object asyncState) +1680
System.Web.Mvc.Async.WrappedAsyncResult`1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +59
System.Web.Mvc.Async.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +151
System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback, Object state, BeginInvokeDelegate beginDelegate, EndInvokeDelegate`1 endDelegate, Object tag, Int32 timeout) +94
System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) +559
System.Web.Mvc.Controller.<BeginExecuteCore>b__1c(AsyncCallback asyncCallback, Object asyncState, ExecuteCoreState innerState) +82
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +73
System.Web.Mvc.Async.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +151
System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback, Object callbackState, BeginInvokeDelegate`1 beginDelegate, EndInvokeVoidDelegate`1 endDelegate, TState invokeState, Object tag, Int32 timeout, SynchronizationContext callbackSyncContext) +105
System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state) +588
System.Web.Mvc.Controller.<BeginExecute>b__14(AsyncCallback asyncCallback, Object callbackState, Controller controller) +47
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +65
System.Web.Mvc.Async.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +151
System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback, Object callbackState, BeginInvokeDelegate`1 beginDelegate, EndInvokeVoidDelegate`1 endDelegate, TState invokeState, Object tag, Int32 timeout, SynchronizationContext callbackSyncContext) +139
System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +484
System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +50
System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__4(AsyncCallback asyncCallback, Object asyncState, ProcessRequestState innerState) +98
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +73
System.Web.Mvc.Async.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +151
System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback, Object callbackState, BeginInvokeDelegate`1 beginDelegate, EndInvokeVoidDelegate`1 endDelegate, TState invokeState, Object tag, Int32 timeout, SynchronizationContext callbackSyncContext) +106
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +446
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +88
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +50
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
我正确地浏览了我的模型和我的ViewModel,我没有在属性中找到任何重复。这是我的ViewModel:
public class ArticlesViewModel
{
public ArticlesViewModel()
{
Teams = new List<TeamVM>();
}
public string gameName { get; set; }
public List<TeamVM> Teams { get; set; }
[Required]
[DisplayName("Article Content")]
public string articleContent { get; set; }
public System.DateTime date { get; set; }
[Required]
[DisplayName("Article Title")]
public string articleTitle { get; set; }
[ValidateFile]
[Display(Name = "FeaturedImage")]
public HttpPostedFileBase featuredImage { get; set; }
[ValidateFile]
[Display(Name = "Picture Gallery Image(s)")]
public IEnumerable<HttpPostedFileBase> picturePath { get; set; }
// properties for the articles, game, gallery and teams respectively
public gallery mgallery { get; set; }
public TeamVM teams { get; set; }
}
这是viewmodel的控制器操作:
namespace TeamBuildingCompetition.Areas.Admin.Controllers
{
public class ArticlesController : BaseAdminController
{
// GET: Admin/Articles
TBCDBEntities db;
public ArticlesController()
{
db = new TBCDBEntities();
}
[HttpGet]
public ActionResult Index()
{
ArticlesViewModel model = new ArticlesViewModel();
var teamList = (from p in db.teams
select new TeamVM()
{
teamID = p.teamID,
TeamName = p.teamName,
IsSelected = p.IsSelected
});
model.Teams = teamList.ToList();
ViewBag.gameList = new SelectList(db.games, "gameID", "gameName");
return View(model);
}
[HttpPost]
public ActionResult Create(ArticlesViewModel model)
{
try
{
// Get the featured file name
string featuredFileName = Path.GetFileName(model.featuredImage.FileName);
// Get the featured file path
string path = Path.Combine(Server.MapPath("~/Content/Upload"), featuredFileName);
// Get the path that will be saved into the database
string imgDBPath = "~/Content/Upload/" + featuredFileName.ToString();
// Save the featured images to the folder
model.featuredImage.SaveAs(path);
// Declare the picture gallery file path names
var getFileNames = "";
var getGalleryPath = "";
var getGalleryImgPath = "";
// Iterate through each file in the collection
foreach (var item in model.picturePath)
{
getFileNames = Path.GetFileName(item.FileName); // Get the file names
getGalleryPath = Path.Combine(Server.MapPath("~/Content/Upload"), getFileNames); // Get the file paths
getGalleryImgPath = "~/Content/Upload/" + getFileNames.ToString(); // Get the file path to be stored in the database
item.SaveAs(getGalleryPath); // Save the each file in the upload directory
}
// Map article properties with values
article objArticle = new article
{
featuredImage = imgDBPath,
articleTitle = model.articleTitle,
articleContent = model.gameName,
date = DateTime.Now,
lastupdated = DateTime.Now
};
// Map gallery properties with values
gallery objGallery = new gallery
{
gameID = model.mgallery.gameID,
teamID = model.teams.teamID,
picturePath = model.picturePath.ToString()
};
// Insert the article/gallery picture into the database
objBs.articleBs.Insert(objArticle);
objBs.galleryBs.Insert(objGallery);
TempData["Msg"] = "Created Successfully!";
return RedirectToAction("Index");
}
catch (DbEntityValidationException dbEx)
{
var sb = new StringBuilder();
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
sb.AppendLine(string.Format("Entity:'{0}' Property: '{1}' Error: '{2}'",
validationErrors.Entry.Entity.GetType().FullName,
validationError.PropertyName,
validationError.ErrorMessage));
}
}
//throw new Exception(string.Format("Failed saving data: '{0}'", sb.ToString()), dbEx);
TempData["Msg"] = sb.ToString();
return RedirectToAction("Index");
}
}
}
}
每当我从控制器的ArticlesViewModel model
中删除public ActionResult create(ArticlesViewModel model)
时,都会出现空引用错误。
答案 0 :(得分:8)
你们俩都有
public List<TeamVM> Teams { get; set; }
和
public TeamVM teams { get; set; }
虽然这是有效的C#,但您有两个具有相同名称的属性(如果您不考虑案例)。
只需更改名称即可。