2013-12-18 5 views
5

이것은 약 another question I asked과 (과) 관련된 부분입니다. 사용자 역할 정보를 표에 바인딩하려고하는데 사용자에게 역할을 할당하고 있습니다. 각 사용자는 데이터베이스 내에서 여러 역할을 할 수 있으며 Kendo UI MultiSelect를 사용하여 편집해야합니다.Kendo MultiSelect with Kendo UI Grid with ASP.NET MVC

필요한 역할을 선택하고 컨트롤러에 다시 게시하면 "RoleBasicModel"개체의 배열에 필요한 역할 수가 포함되지만 해당 속성은 모두 비어 있습니다.

모델

는 다음과 같이 정의된다 :

@Html.Kendo().MultiSelect().Name("RoleList").DataTextField("Text").DataValueField("Id").BindTo((IEnumerable<Models.RoleBasicModel>)ViewData["uroles"]).Placeholder("No role selected") 
:

@(Html.Kendo().Grid<Models.UserInfo>() 
    .Name("userGrid") 
    .Columns(columns => 
    { 
     columns.Bound(p => p.UserName); 
     columns.Bound(p => p.FirstName); 
     columns.Bound(p => p.LastName); 
     columns.Bound(p => p.Roles).EditorTemplateName("RoleListEditor").Template(p => p.RoleList); 
     columns.Command(command => { command.Edit(); command.Destroy(); }); 
    }) 
    .Filterable() 
    .Sortable() 
    .Resizable(r => r.Columns(true)) 
    .Editable(editable => { editable.Mode(GridEditMode.InLine); editable.DisplayDeleteConfirmation("Are you sure you want to remove this user?"); }) 
    .HtmlAttributes(new { style = "min-height:90px;max-height:450px;" }) 
    .DataSource(dataSource => dataSource 
     .Ajax() 
     .Events(events => events.Error("error_handler")) 
     .Model(model => 
     { 
      model.Id(p => p.UserId); 
      model.Field(p => p.UserId).Editable(false); 
      model.Field(p => p.FirstName).Editable(true); 
      model.Field(p => p.LastName).Editable(true); 
      model.Field(p => p.UserName).Editable(false); 
      model.Field(p => p.RoleList).Editable(true); 
     } 
     ).Read(read => read.Action("GetAllUsers", "Admin").Type(HttpVerbs.Get)) 
     .Update(update => update.Action("UpdateUser", "Admin").Type(HttpVerbs.Post)) 
     .Destroy(update => update.Action("DeleteUser", "Admin").Type(HttpVerbs.Post)) 
    ) 
) 

그리고 검도 다중 선택을 사용하여 내 편집기 템플릿, 다음과 같이 정의된다

public class UserInfo 
{ 
    public string UserId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string UserName { get; set; } 
    public string Roles { get; set; } 
    public IEnumerable<RoleBasicModel> RoleList { get; set; } 
} 
public class RoleBasicModel 
{ 
    public string Id { get; set; } 
    public string Text { get; set; } 
} 

그리드는 설정과 같다

서버로 다시 전송 된 데이터가 비어있는 이유가 있습니까? 사용할 올바른 모델을 정의 할 MultiSelect 컨트롤에서 뭔가 빠졌다고 생각합니다. 나는 종종 비슷한 질문에 대한 답으로 인용되는 the test project을 언급했지만 그와도 아무런 기쁨도 얻지 못했습니다. 요청한 바와 같이

(의 요약본) 내가 사용 컨트롤러 :

public ActionResult ManageUsers() 
    {    
     PopulateRoles(); 
     return View(); 
    } 

    private void PopulateRoles() 
    { 
     ViewData["uroles"] = new ApplicationDbContext().Roles.Select(r => new RoleBasicModel { Text = r.Name, Id = r.Id }).ToList(); 
    } 

    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult GetAllUsers([DataSourceRequest]DataSourceRequest request) 
    { 
     using (var context = new ApplicationDbContext()) 
     { 
      var allUsers = context.Users.ToList().Select(x => 
       new UserInfo 
       { 
        UserName = x.UserName, 
        UserId = x.Id, 
        FirstName = x.FirstName, 
        LastName = x.LastName, 
        RoleList = x.Roles.Select(p => new RoleBasicModel { Text = p.Role.Name, Id = p.RoleId }), 
        Roles = string.Join(", ", x.Roles.Select(p => p.Role.Name).ToList()) 
       }).ToList(); 
      return Json(allUsers.ToDataSourceResult(request), JsonRequestBehavior.AllowGet); 
     } 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult UpdateUser([DataSourceRequest] DataSourceRequest request, UserInfo user) 
    { 
     if (user != null && ModelState.IsValid) 
     { 
      using (var context = new ApplicationDbContext()) 
      { 
// Do something with the user details 
      } 
     } 

     return Json(new[] { user }.ToDataSourceResult(request, ModelState)); 
    } 

EDIT : 재생 서버에 등록한 데이터를 시청하면 선택된 개체들의 어레이 외설 것처럼, 그것은 '표시 t는 올바르게 파싱되었습니다. 형식은 RoleList [0] .Id : 123456이어야하며 대신 RoleList [0] [Id] : 123456입니다. 이 코드는 MultiSelect 컨트롤에서 문제가 될 수 있다고 생각합니다.

+0

(당신이 검도 그리드를 사용하는 경우) 서버에 게시하기 전에 검도 다중 선택 자신 내부의 데이터에는 직렬화 ? 우리 멍청이를 줘!:) – loxdog

+0

나는 당신에게 똑같은 질문을 던질 수있다. 분명히 완성되지 않은 것을 게시하는 이유는 무엇인가? – tnw

+0

우연히 enter! 이전에 Stack에서 만들었던 정직한 실수 ... – loxdog

답변

4

그래서 결국 문제가 무엇인지 알아 냈습니다. 편집 할 때마다 데이터가 MultiSelect 컨트롤에서 제대로 직렬화되지 않은 것으로 나타났습니다.

example available on the Kendo website이 작동하는 데 얼마간의 시간이 걸렸으며 서버에 올바로 데이터가 으로 잘못 게시 된 것으로 나타났습니다. (나에게 말도 안되는 것)가 사용 된 트릭은 자신이 "직렬화"기능은 다음과 같이 정의된다

.Update(update => update.Action("UpdateUser", "Admin").Type(HttpVerbs.Post).Data("serialize"))

를 즉위한 그리드에 업데이트 기능에, 그들은 배열 내부의 데이터에는 직렬화한다는 것입니다 :

function serialize(data) { 
    for (var property in data) { 
     if ($.isArray(data[property])) { 
      serializeArray(property, data[property], data); 
     } 
    } 
} 

function serializeArray(prefix, array, result) { 
    for (var i = 0; i < array.length; i++) { 
     if ($.isPlainObject(array[i])) { 
      for (var property in array[i]) { 
       result[prefix + "[" + i + "]." + property] = array[i][property]; 
      } 
     } 
     else { 
      result[prefix + "[" + i + "]"] = array[i]; 
     } 
    } 
} 

내 문제에 대한 해결을 위해 주변에 광범위하게 검색하는 데, 다른 사람이 설명없이 작업 솔루션에 지적 된, 나는 당신이하려고 할 때 문제가 무엇인지 이해하기 위해 다른 사람에게 유용 할 수 있습니다 생각 Kendo Grid에서 Kendo MultiSelect를 사용하십시오. g "이 예제를 보라".

TL, 당신은 분명 완전하지 무언가에 이렇게 빨리 게시 할 것입니다 왜 박사 항상

+0

이 답변을 게시 해 주셔서 감사합니다. 나는 이것이 내가 찾고있는 것이라고 생각한다. – madvora