2

問題は本当に単純ですが、私はそれを解決できないようです。DevExpress コンボ ボックスで Razor エンジンを使用しています。

私はこのコードを持っています:

モデル:

public class TestModel
{
    public string Name { get; set; }
    public List<Role> Roles { get; set; }
}

public class Role
{
    public int RoleId { get; set; }
    public string RoleName { get; set; }
}

コントローラ

    public ActionResult OpenTest()
    {
        TestModel tm = new TestModel( );
        tm.Roles = new List<Role>( );

        tm.Roles.Add( new Role( ) { RoleId = 1, RoleName = "Role 1" } );
        tm.Roles.Add( new Role( ) { RoleId = 2, RoleName = "Role 2" } );
        tm.Roles.Add( new Role( ) { RoleId = 3, RoleName = "Role 3" } );

        return View( tm );
    }

ここでビューを正常に開くことができ、データが正常に表示されます。

見る

@model TestDx.Models.TestModel
@{
    ViewBag.Title = "OpenTest";
}
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using ( Html.BeginForm( ) )
{
                        @Html.DevExpress( ).ComboBox(
                    settings =>
                    {
                        settings.Name = "TestDx.Models.TestModel.Roles";
                        settings.Width = 120;
                        settings.SelectedIndex = 0;
                        settings.Properties.DropDownWidth = 300;
                        settings.Properties.DropDownStyle = DevExpress.Web.ASPxEditors.DropDownStyle.DropDownList;
                        settings.Properties.EnableCallbackMode = false;
                        settings.Properties.CallbackPageSize = 30;
                        settings.Properties.IncrementalFilteringMode = DevExpress.Web.ASPxEditors.IncrementalFilteringMode.StartsWith;
                        settings.Properties.TextFormatString = "{0}";
                        settings.Properties.ValueField = "RoleID";
                        settings.Properties.ValueType = typeof( int );

                        settings.Properties.Columns.Add( "RoleID", "RoleID", 10 );
                        settings.Properties.Columns.Add( "RoleName", "RoleName", 100 );

                    } ).BindList( Model.Roles ).GetHtml( )
        <br />
            @Html.DevExpress().Button(
                    settings =>
                    {
                        settings.Name = "btnSave";
                        settings.ClientEnabled = true;
                        settings.ControlStyle.CssClass = "button";
                        settings.ClientVisible = true;

                        settings.Text = "save";
                        settings.UseSubmitBehavior = true;
                        settings.ControlStyle.Font.Bold = true;
                    }).GetHtml()
}

これはすべて非常に単純で、私はそれを使って何もしていません。しかし、[保存] ボタンをクリックすると、コントローラーの次のメソッドに戻ります。

[HttpPost]
        public ActionResult OpenTest( [ModelBinder( typeof( DevExpressEditorsBinder ) )]TestModel model )
        {
            if ( ModelState.IsValid )
            {
               //
            }

            return View( model );
        }

...ここのモデルは空で、ロール プロパティは 0 です。なぜなのかわかりません。コンボ ボックス名がバインド先のプロパティと同じである場合、推奨される DevExpress バインダーを使用していると確信しています。

ありがとう。

4

2 に答える 2

0

モデルはバインドされていません。RoleID name 属性は、Roles[listIndex].RoleID とは異なる必要があります。リストをモデルにバインドするには、入力名を次のようにする必要があります。ListPropName[listIndex].PropNameInsideList

于 2013-05-15T20:03:51.653 に答える
0

ComboBox の名前には、型定義がリストされています。タイプとしてTestModelを渡すため、ComboBox の名前は、ロール ID を保存するプロパティにする必要があります。そのため、バインダーはmodel.TestDx.Models.TestModel.Rolesを入力しようとしていますが、そのフィールドが見つからないため、何も入力されていません。formCollection オブジェクトを見ると、ComboBox に値が表示されているはずです。

より良い解決策は、 RoleID をTestModel指定し、ComboBox に単にRoleIDという名前を付けることです。その場合、RoleID は保存時に自動的に入力されます。または、次のように、ビューで Bind フィールドを指定することもできます。

 @Html.DevExpress( ).ComboBox(
                    settings =>
                    {
                        settings.Name = "TestDx.Models.TestModel.Roles";
                        settings.Width = 120;
                        settings.SelectedIndex = 0;
                        settings.Properties.DropDownWidth = 300;
                        settings.Properties.DropDownStyle = DevExpress.Web.ASPxEditors.DropDownStyle.DropDownList;
                        settings.Properties.EnableCallbackMode = false;
                        settings.Properties.CallbackPageSize = 30;
                        settings.Properties.IncrementalFilteringMode = DevExpress.Web.ASPxEditors.IncrementalFilteringMode.StartsWith;
                        settings.Properties.TextFormatString = "{0}";
                        settings.Properties.ValueField = "RoleID";
                        settings.Properties.ValueType = typeof( int );

                        settings.Properties.Columns.Add( "RoleID", "RoleID", 10 );
                        settings.Properties.Columns.Add( "RoleName", "RoleName", 100 );

                    } ).BindList( Model.Roles )
                       .Bind(model.RoleID).GetHtml( )

これは、バインディングで機能する場合があります。

于 2013-05-15T19:04:31.713 に答える