2013-12-18 23 views
5

これは最近約another question I askedに関連しています。ユーザーロール情報をグリッドにバインドしようとしており、ユーザーにロールを割り当てています。各ユーザーはデータベース内で複数の役割を持つことができ、これらは剣道UI MultiSelectを使用して編集する必要があります。剣道MultiSelectを剣道UIグリッドでASP.NET MVCで使用する

必要なロールを選択してコントローラにポストバックすると、「RoleBasicModel」オブジェクトの配列には必要なロール数が含まれますが、すべてのプロパティは空です。

モデルは次のように定義されています

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; } 
} 

グリッドはよう設定です:

@(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)) 
    ) 
) 

そして剣道複数選択を使用して、私のエディタのテンプレートは、次のように定義されます

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

サーバーに返信されたデータが空であるという明らかな理由はありますか?私は使用する正しいモデルを定義する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)); 
    } 

編集:サーバーにポストバックされたデータを表示する際に選択したオブジェクトの配列がにISNかのように、それが表示されます正しく解析されませんでした。形式はRoleList [0] .Id:123456である必要がありますが、代わりにRoleList [0] [Id]:123456です。私はこれがMultiSelectコントロールの問題ではなく、私が書いたコードではないかと思っていますか?

+0

(あなたが剣道グリッドを使用している場合)、サーバーに投稿する前に剣道複数選択、自分の内部データをシリアライズ?私たちに馬鹿を与えてください!:) – loxdog

+0

私はあなたに同じ質問をすることができました。 – tnw

+0

誤って入力!スタック上で私が前にした正直な間違い... – 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]; 
     } 
    } 
} 

は私の問題への解決のために周りの広範囲に探索した、と他の人が説明なしで作業溶液を指摘してきた、私はあなたがしようとすると、問題が何であるかを理解するために他の誰かの役に立つかもしれないと思いました剣道グリッドで剣道のマルチセレクションを使ってください。 g "この例を見てください"。

TL;あなたは明らかに完全ではなかった何かにそうすぐに投稿するだろう、なぜDR は常に

+0

この回答を投稿していただきありがとうございます。私はこれがまさに私が探しているものだと思います。 – madvora

関連する問題