2015-02-04 10 views
1

바인딩하지 내가 가지고있는 다음과 같은 비즈니스 클래스CslaModelBinder는 아이리스트

public class EditableRoot:Csla.BusinessBase<EditableRoot> 
{ 
    public string Name { get; private set; } 
    public int Id { get; private set; } 

    public static EditableRoot New() { 
     return DataPortal.Create<EditableRoot>(); 
    } 

    public static readonly PropertyInfo<EditableChildList> ChildListProperty = RegisterProperty<EditableChildList>(c => c.ChildList, RelationshipTypes.Child); 
    public EditableChildList ChildList 
    { 
     get { return GetProperty(ChildListProperty); } 
     private set { SetProperty(ChildListProperty, value); } 
    } 
    protected override void DataPortal_Create() 
    { 
     ChildList = EditableChildList.New(); 
    } 

} 
public class EditableChildList : Csla.BusinessListBase<EditableChildList,EditableChild> 
{ 
    public static EditableChildList New() { return DataPortal.CreateChild<EditableChildList>(); } 
} 
public class EditableChild : Csla.BusinessBase<EditableChild> 
{ 
    public static readonly PropertyInfo<string> AssignedByProperty = RegisterProperty<string>(c => c.AssignedBy); 
    public string AssignedBy 
    { 
     get { return GetProperty(AssignedByProperty); } 
     private set { LoadProperty(AssignedByProperty, value); } 
    } 
    public static readonly PropertyInfo<int> DocTypeIDProperty = RegisterProperty<int>(c => c.DocTypeID); 
    public int DocTypeID 
    { 
     get { return GetProperty(DocTypeIDProperty); } 
     set { SetProperty(DocTypeIDProperty, value); } 
    } 
    public static EditableChild New(int docTypeId) { return DataPortal.CreateChild<EditableChild>(docTypeId); } 
    void Child_Create(int docTypeId) 
    { 
     DocTypeID = docTypeId; 
     AssignedBy = "AssignedBy" + docTypeId; 
    } 

} 

내가 컨트롤러

public class ComplexTypeController : Csla.Web.Mvc.Controller, Csla.Web.Mvc.IModelCreator 
{ 
    // 
    // GET: /ComplexType/ 
    public ActionResult Create() 
    { 
     EditableRoot type = EditableRoot.New(); 
     ViewData.Model = type; 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Create(EditableRoot complexType, FormCollection collection, string submit) 
    { 
     if (submit != "Create") 
     { 
      Random rand = new Random(); 

      complexType.ChildList.Add(EditableChild.New(rand.Next())); 

     } 
     ViewData.Model = complexType; 
     return View(); 
    } 

    public object CreateModel(Type modelType) 
    { 
     if (modelType == typeof(EditableRoot)) 
      return EditableRoot.New(); 
     else if (modelType == typeof(EditableChildList)) 
      return EditableChildList.New(); 
     else if (modelType == typeof(EditableChild)) 
      return EditableChild.New(0); 
     else 
      return Activator.CreateInstance(modelType); 
    } 
} 

이 내가보기를

@model EditableRoot 

@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create</h2> 
@using (Html.BeginForm()) 
{ 
    @Html.DisplayFor(m => m.Name); 
    @Html.HiddenFor(m => m.Id); 
    <table> 
     <thead> 
      <tr> 
       <th>Child Type Name</th> 
       <td>Child Type Id</td> 
      </tr> 
     </thead> 


    <tbody> 
      @for (int i = 0; i < Model.ChildList.Count(); i++) 
      { 
       <tr> 
        <td> 
         @Html.TextBoxFor(a => Model.ChildListIdea.AssignedBy) 
        </td> 
        <td> 
         @Html.TextBoxFor(a => Model.ChildListIdea.DocTypeID) 
        </td> 
       </tr> 
      } 
     </tbody> 
    </table> 
    <input name="submit" type="submit" id="submit" value="Create" /> 
    <input name="submit" type="submit" id="process" value="Add Child" />      
} 

내가 클릭하여 EditableChild를 추가 "하위 항목 추가"버튼을 클릭 한 다음 "편집"버튼을 클릭하십시오. ic ActionResult Create (EditableRoot complexType, FormCollection collection, string submit) 호출이 바인딩되지 않습니다.

즉, 자식 목록 EditableRoot.ChildList는 바인딩되지 않으며보기의 HTML이 복잡한 유형의 바인딩 목록 규칙을 따르는 경우에도 목록에 항목이 없습니다. 그리고 브라우저에서 실제 HTML을 볼 때 EditableRoot.ChildList의 항목에 대해 생성 된 행이 존재하고 올바르게 명명됩니다.

그러나 github에서 CslaModelBinder를 가져 와서 내 프로젝트에 넣고 mvc 기본 모델 바인더를 사용하여 연결했습니다. 그럼 난 CslaModelBinder 방법

공공 재정의 객체 BindModel (ControllerContext controllerContext, ModelBindingContext BindingContext를)

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
      { 
       //if (typeof(Csla.Core.IEditableCollection).IsAssignableFrom((bindingContext.ModelType))) 
       // return BindCslaCollection(controllerContext, bindingContext); 

       var suppress = bindingContext.Model as Csla.Core.ICheckRules; 
       if (suppress != null) 
        suppress.SuppressRuleChecking(); 
       var result = base.BindModel(controllerContext, bindingContext); 
       return result; 
      } 

모두가 일을 같이하기를 바 꾸었습니다. EditableRoot.ChildList 속성이 바인딩되고 예상되는 항목이 목록에 있습니다.

궁극적으로 CslaModelBinder 방법의 내 수정

공공 재정의 객체 BindModel (ControllerContext controllerContext, ModelBindingContext BindingContext를)

CSLA IEditableCollection 바인딩의 취급 밖으로 의견 등 방법은 궁극적으로베이스의 BindModel 메소드를 호출 DefaultModelBinder 클래스 어떤 작품.

그러나 수정 된 CslaModelBinder를 사용하면 다른 곳에서 문제가 발생합니까?

DefaultModelBinder이 Csla.Core.IEditableCollection 유형의 바인딩을 처리 할 수있는 경우

경우 (대해서 typeof (Csla.Core.IEditableCollection) .IsAssignableFrom ((bindingContext.ModelType))) 반환 BindCslaCollection (controllerContext, BindingContext를) ;

???

+0

안녕 앤드류를 참조하십시오? 이 문제는 공식적으로 "도움을 원합니다"라고 표시되어 있습니다. –

+0

@MichaelCsikos, 아니요 BindCslaCollection을 수정하지 않았습니다. 그 코드를 살펴본 지 오래되었지만, 어떻게 든 해결해야했습니다. – andrewramka

답변

0

문제를 해결할 수있는 티켓이있는 자식 컬렉션에 바인딩하는 것과 관련된 알려진 문제가 있습니다.

당신이 CslaModelBinder에서 BindCslaCollection 방법을 고정에 대한 생각, https://github.com/MarimerLLC/csla/issues/19