2

現在、プロジェクトの編集機能に取り組んでいますが、View Model を View から Controller に戻す権利を取得できないようです。ビュー モデルの構造は次のとおりです。

public class CreateUserViewModel : ICreateUserViewModel
{
    #region Properties
    public string UserName { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }
    public string SelectedUserType { get; set; }
    public List<ICreateUserItemViewModel> UserTypes { get; set; }
    public List<ICreateUserItemViewModel> Products { get; set; }
    public List<ICreateUserItemViewModel> Languages { get; set; }
    #endregion

    #region Constructor
    public CreateUserViewModel()
    {
    }

    public CreateUserViewModel(List<Product> products, List<Language> languages)
    {
        Products = new List<ICreateUserItemViewModel>();
        foreach (var prod in products)
        {
            var prodVM = new CreateUserItemViewModel
            {
                Name = prod.Name,
                IsSelected = false,
                ID = (int)prod.ID
            };
            Products.Add(prodVM);
        }

        Languages = new List<ICreateUserItemViewModel>();
        foreach (var lang in languages)
        {
            var langVM = new CreateUserItemViewModel
            {
                Name = lang.Name,
                IsSelected = false,
                ID = (int)lang.ID
            };
            Languages.Add(langVM);
        }

    }
    #endregion
}

サブクラス ViewModel CreateUserItemViewModel:

public class CreateUserItemViewModel : ICreateUserItemViewModel
{
    public string Name { get; set; }
    public int ID { get; set; }
    public bool IsSelected { get; set; }
}

このサブクラスをチェックボックスとしてビューに表示して、ユーザーが含めるかどうかを選択できるようにします。

ユーザーコントローラー:

[HttpPost]
public ActionResult Create(CreateUserViewModel model)
{
    if (ModelState.IsValid)
    {
        User newUser = new User();
        newUser.UserName = model.UserName;
        newUser.Password = model.Password;
        newUser.Email = model.Email;
        newUser.Products = model.Products; //Always NULL

アプリケーションのこの部分にブレーク ポイントを配置すると、ユーザー名、パスワード、電子メールのプロパティは入力されますが、製品と言語は空です。Fiddler2 を使用してコントローラーに渡される内容を監視したところ、次のような出力が得られました。

UserName=asdasdsdasd&Password=asd&Email=asD%40asd.com&type.IsSelected=Admin
&prod.ID=1&prod.IsSelected=true&prod.IsSelected=false
&prod.ID=2&prod.IsSelected=false
&prod.ID=3&prod.IsSelected=false
&prod.ID=4&prod.IsSelected=false
&lang.ID=1&lang.IsSelected=true&lang.IsSelected=false
&lang.ID=2&lang.IsSelected=true&lang.IsSelected=false
&lang.ID=3&lang.IsSelected=false
&lang.ID=4&lang.IsSelected=false
&lang.ID=5&lang.IsSelected=false
&lang.ID=6&lang.IsSelected=false
&lang.ID=7&lang.IsSelected=false
&lang.ID=8&lang.IsSelected=false
&lang.ID=9&lang.IsSelected=false
&lang.ID=10&lang.IsSelected=false
&lang.ID=11&lang.IsSelected=false
&lang.ID=12&lang.IsSelected=false
&lang.ID=13&lang.IsSelected=false
&lang.ID=14&lang.IsSelected=false
&lang.ID=15&lang.IsSelected=false
&lang.ID=16&lang.IsSelected=false
&lang.ID=17&lang.IsSelected=false
&lang.ID=18&lang.IsSelected=false
&lang.ID=19&lang.IsSelected=false

ビューの作成のコードのナゲットは次のとおりです。

<div class="editor-label">
    @Html.Label("User Products:")
</div>
<div class="editor-field">
    @foreach (var prod in Model.Products)
    {
        @Html.Label(prod.Name)
        @Html.HiddenFor(x => prod.ID)
        @Html.CheckBoxFor(x => prod.IsSelected, new { name = prod.Name })
    }
</div>
<div class="editor-label">
    @Html.Label("User Languages:")
</div>
<div class="editor-field">
    @foreach (var lang in Model.Languages)
    {
        @Html.Label(lang.Name)
        @Html.HiddenFor(x => lang.ID)
        @Html.CheckBoxFor(x => lang.IsSelected, new { name = lang.Name })
    }
</div>
<p>
    <input type="submit" value="Create" />
</p>

私はかなり長い間これに取り組んできましたが、私がやろうとしていることは不可能だと思い始めています. ユーザーが選択したすべての値を完全に入力して返したいのですCreateUserViewModelが、これを達成する方法がわかりません。

何か案は?

4

2 に答える 2

6

foreach の代わりに for ループを使用します。

@for (int i=0; i < Model.Products.Count; i++)
{
    @Html.Label(prod.Name)
    @Html.HiddenFor(model => model.Products[i].ID)
    @Html.CheckBoxFor(model => model.Products[i].IsSelected, new { name = prod.Name })
}

プロパティ式には、モデル バインダーが POST 値をモデルにバインドする方法を理解するのに十分な情報が含まれている必要があります。

のエディター テンプレートを作成してICreateUserItemViewModelから、マークアップを次のように変更することもできます。

@Html.EditorFor(model => model.Products)
于 2012-12-18T15:58:49.803 に答える
1

投稿された回答で既に述べたように、インデックスを適用することで実行できますが、要素が連続していない場合は、以下の記事を参照してください

http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

「モデルバインディング」の紹介については、以下も参照してください。

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

提案リストに追加して、ビューモデルから CreateUserViewModel(List products, List languages) を削除することを検討してください。ViewModel にはプロパティのみを含め、コントローラー内に追加のロジックを配置する必要があります (つまり、ユーザーの場合は UserTypes などをアタッチします)。

于 2012-12-18T16:06:36.040 に答える