DbEntry 在 ASP.NET MVC 中的问题

Feb 17, 2009 at 6:41 AM
Edited Feb 17, 2009 at 7:25 AM
初用DbEntry,英语也不太好,只好用中文提问了:
我使用了以下这种模型定义方式:
 /// <summary>
 /// MyClass
 /// </summary>
 public abstract partial class MyClass : LinqObjectModel<MyClass>
 {
  public abstract string Name{set;get;}
}
在ASP.NET MVC中的一个Controller:
public class MyController : Controller
    {
public ActionResult MyClassSave(MyClass myclass)
{
    myclass.Save();
    return View();
}
================================================
这样是有问题的,因为MyClass是抽象类~无法直接由ModelBuilder绑定。
当然也可以直接继承DbObject,但又无法使用例如
MyClass.FindAll() 这样的便利方式了……

--我的尝试:------------------
我曾想写一个ModelBinder,单独处理继承自 LinqObjectModel的抽象类的 ModelBuilder,但是……
在Global.asax的protected void Application_Start()中 ,又不知道如何捕获这种抽象类:

ModelBinders.Binders.Add(typeof(LinqObjectModel<>),new MyAbstractModelBinder());//这句要怎么写呢?


Coordinator
Feb 17, 2009 at 8:21 AM
没用过 ASP.NET MVC,所以也不知道 ModelBinders 怎么用,不过,可以使用下面的方法取得实际的Type:
var type = DynamicObject.GetImplType(typeof(MyClass));
Coordinator
Feb 19, 2009 at 6:07 AM
试了一下 ASP.NET MVC,我个人是不太赞成你的那种Controller的写法的,我更倾向与使用Id,或者具体的值当作参数,而不是类。如果确实要,建议多写一个参数类:
public class MyClassParamter
{
    public string Name { get; set; }
}

public class MyController : Controller
{
    public ActionResult MyClassSave(MyClassParamter cls)
    {
        MyClass.New().Init(cls).Save();
    }
}
Coordinator
Feb 27, 2009 at 3:23 AM
OK, I was wrong about this with ASP.NET MVC. It's needed.
Here is the ModelBinder:

public class MyBinder : IModelBinder

{

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)

    {

        ObjectInfo oi = ObjectInfo.GetInstance(bindingContext.ModelType);

        object obj = oi.NewObject();

 

        foreach(var field in oi.Fields)

        {

            if(!field.IsRelationField)

            {

                ValueProviderResult result;

                if (bindingContext.ValueProvider.TryGetValue(field.Name, out result))

                {

                    field.SetValue(obj, result.ConvertTo(field.FieldType));

                }

            }

        }

 

        return obj;

    }

}

Coordinator
Feb 27, 2009 at 3:40 AM
Edited Feb 27, 2009 at 3:46 AM
And you can not add them by just one Add function call, so it should be:

protected void Application_Start()

{

    var types = typeof(MvcApplication).Assembly.GetTypes();

    foreach(var type in types)

    {

        if(type.IsSubclassOf(typeof(DbObjectSmartUpdate)))

        {

            ModelBinders.Binders.Add(type, new MyBinder());

        }

    }

    RegisterRoutes(RouteTable.Routes);

}

 

Mar 3, 2009 at 4:50 AM
Edited Mar 3, 2009 at 5:43 AM
非常感谢了,但是……

public class MyBinder : IModelBinder

{

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)

    {

        ObjectInfo oi = ObjectInfo.GetInstance(bindingContext.ModelType);

        object obj = oi.NewObject();

 

        foreach(var field in oi.Fields)

        {

            if(!field.IsRelationField)

            {

                ValueProviderResult result;

                if (bindingContext.ValueProvider.TryGetValue(field.Name, out result))

                {

                    field.SetValue(obj, result.ConvertTo(field.FieldType));

                }

            }

        }

 

        return obj;

    }

}
------------------------

错误 1 “Lephone.Data.Common.MemberHandler”不包含“IsRelationField”的定义

Mar 3, 2009 at 5:41 AM
Edited Mar 3, 2009 at 5:41 AM
版本问题,后来在最新的版本里找到了。
再次感谢。