5

これについて多くの質問がありました...しかし、どういうわけかこのバインディングを機能させることができず、投稿されたビュー モデルでまだ null 値を取得しています。これは MVC4 です。

これがメインビューモデルです

public class RoleVM {

[Required]
[Display(Name = "Name of the Role")]
public string Role {get; set;}

public IEnumerable<RolePermission> permissions { get; set; }

}

ここに RolePermission クラスがあります

public class RolePermission {

public int id;

public bool permission_value;

public string name { get; set; } 

}

ここにコントローラーのGET Createメソッドがあります

public ActionResult Create() {

        RoleVM role_vm = new RoleVM();

        var allpermissions = from p 
        in permission_repo.GetPermissions()
        select p; 

        role_vm.permissions = from p 
        in allpermissions 
        select new RolePermission
        { name = p.name, id = p.PermissionId, permission_value = false };

        return View(role_vm);
    }

ここにCreate.cshtmlファイルがあります

@model RoleVM
@using (Html.BeginForm("Create", "Role", 
FormMethod.Post, new { @class = "permission_form" }))
{
@Html.ValidationSummary(true)

<fieldset>
    <legend>RoleVM</legend>

    <div class="form-item">
        @Html.LabelFor(model => model.Role)

        @Html.EditorFor(model => model.Role)
        @Html.ValidationMessageFor(model => model.Role)
    </div>

   @Html.EditorFor(model => model.permissions)

    <p>
        <input class="submit-btn" type="submit" value="Create" />
    </p>
</fieldset>
}

次は ~/Views/Shared/EditorTemplates にある rolepermissions.cshtml ファイルです。

@model RolePermission

<div class="form-item">
      @Html.HiddenFor(modelItem => modelItem.id) 
      @Html.LabelFor(modelItem => modelItem.permission_value, Model.name)
      @Html.CheckBoxFor(modelItem => modelItem.permission_value) 
</div>

ページにレンダリングされる html アイテムの 1 つの例を次に示します。

<div class="form-item">

      <input data-val="true" data-val-number="The field Int32 must be a number." data-val-required="The Int32 field is required." id="permissions_2__id" name="permissions[2].id" type="hidden" value="3" /> 

      <label for="permissions_2__permission_value">Role-Edit</label>
      <input data-val="true" data-val-required="The Boolean field is required."  id="permissions_2__permission_value" name="permissions[2].permission_value"
 type="checkbox" value="true" /><input name="permissions[2].permission_value"  type="hidden" value="false" /> 

</div>

最後に、Create POST メソッドです。

    [HttpPost]
    public ActionResult Create(RoleVM rolevm)
    {

        //In here rolevm.role is populated based on the textbox input
        //However rolevm.permissions is there with the correct 
        //number of items, but the values all are not binded
        // id is null, name is empty, and permission_value is false 
        // regardless of which checkboxes were checked 


        return RedirectToAction("Index");
    }

投稿されたモデルのバインディングの問題に関するヘルプは本当に素晴らしいでしょう.

4

1 に答える 1

11

これは単純な問題でした。他の誰かがこの問題に遭遇した場合、これが役立つかもしれません。get; でプロパティとして宣言されたクラスのプロパティがありませんでした。設定;

public class RolePermission {

public int id { get; set; } 

public bool permission_value { get; set; } 

public string name { get; set; } 

}
于 2012-07-18T22:37:21.563 に答える