我正在尝试使用自定义模型绑定器
将记录添加到我的数据库中public class PostModelBinder: DefaultModelBinder
{
private IBlogRepository repository;
public PostModelBinder(IBlogRepository repo)
{
repository = repo;
}
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var post = (Post)base.BindModel(controllerContext, bindingContext);
if (post.Category != null)
post.Category = repository.Category(post.Category.CategoryID);
var tags = bindingContext.ValueProvider.GetValue("Tags").AttemptedValue.Split(',');
if (tags.Length > 0)
{
post.Tags = new List<Tag>();
foreach (var tag in tags)
{
post.Tags.Add(repository.Tag(int.Parse(tag.Trim())));
}
}
return post;
}
}
当我尝试提交记录时,我将对象引用未设置为此行上的对象错误实例
post.Category = repository.Category(post.Category.CategoryID);
我不确定导致此错误的原因。
以下是我在Global.asax.cs
中设置模型绑定器的方法//model binder
var repository = DependencyResolver.Current.GetService<IBlogRepository>();
ModelBinders.Binders.Add(typeof(Post), new PostModelBinder(repository));
我的存储库
public Category Category(int id)
{
return context.Categories.FirstOrDefault(c => c.CategoryID == id);
}
和我的控制器动作
[HttpPost]
public ContentResult AddPost(Post post)
{
string json;
ModelState.Clear();
if (TryValidateModel(post))
{
var id = repository.AddPost(post);
json = JsonConvert.SerializeObject(new
{
id = id,
success = true,
message = "Post added successfully."
});
}
else
{
json = JsonConvert.SerializeObject(new
{
id = 0,
success = false,
message = "Failed to add the post."
});
}
return Content(json, "application/json");
}
这是我正在使用的工厂:
public class NinjectControllerFactory: DefaultControllerFactory
{
private IKernel ninjectKernel;
public NinjectControllerFactory()
{
ninjectKernel = new StandardKernel();
AddBindings();
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
return controllerType == null
? null
: (IController)ninjectKernel.Get(controllerType);
}
private void AddBindings()
{
ninjectKernel.Bind<IBlogRepository>().To<EFBlogRepository>();
ninjectKernel.Bind<IAuthProvider>().To<FormsAuthProvider>();
}
}
答案 0 :(得分:2)
我解决了这个问题。
首先,我使用ninject依赖解析器切换了ninject控制器工厂。
使用依赖项解析程序后,我得到另一个错误说&#34;实体对象不能被IEntityChangeTracker的多个实例引用&#34; See Here
所以我在那个问题上尝试了建议的答案但仍然没有希望(但这最终也帮助了我)。然后我在这篇文章part-5-creating-a-post的评论部分提出了另一个问题,并意识到有一个ninject mvc扩展用于依赖注入,我安装了扩展,在那里添加了我的绑定并删除了我自己的依赖解析器,在帮助下之前的回答,我添加了&#34; InRequestScope()&#34; (你必须有Ninject.Web.Common)并且它有效。
所以在App_Start文件夹下的NinjectWebCommon.cs中:
kernel.Bind<IBlogRepository>().To<EFBlogRepository>().InRequestScope();
答案 1 :(得分:1)
这是一个模型绑定问题。 Category
对象未与POSTed值正确绑定。使用Firebug或某些工具查看CategoryID
是否从jqGrid发布。