2

HttpPost でオブジェクトを渡すときに問題が発生しました... フォームが送信されると、コントローラー側でモデルが "null" に設定され、どこに問題があるのか​​ わかりません..

これが私のコントローラーです:

    public ActionResult AddUser(int id = 0)
    {
        Group group = db.Groups.Find(id);
        List<User> finalList = db.Users.ToList() ;

        return View(new AddUserTemplate()
            {
                group = group,
                users = finalList
            });
//Everything is fine here, the object is greatly submitted to the view
    }



    [HttpPost]
    public ActionResult AddUser(AddUserTemplate addusertemplate)
    {
//Everytime we get in, "addusertemplate" is NULL
        if (ModelState.IsValid)
        {
//the model is null
        }
        return View(addusertemplate);

    }

AddUserTemplate.cs は次のとおりです。

    public class AddUserTemplate
{
    public Group group { get; set; }
    public User selectedUser { get; set; }
    public ICollection<User> users { get; set; }
}

コントローラーに null 値を返すフォームを次に示します (ドロップダウン リストには適切な値が大量に入力されていることに注意してください)。

@using (Html.BeginForm()) {
<fieldset>
    <legend>Add an user</legend>
    @Html.HiddenFor(model => model.group)
    @Html.HiddenFor(model => model.users)
    <div class="editor-field">
//Here, we select an user from Model.users list
        @Html.DropDownListFor(model => model.selectedUser, new SelectList(Model.users))
    </div>
    <p>
        <input type="submit" value="Add" />
    </p>
</fieldset>
}

助けてくれてどうもありがとう

4

2 に答える 2

2

私はあなたのコードを試しましたが、私の場合、addusertemplateモデルはnullではありませんでしたが、そのプロパティはすべてnullでした。

これは、いくつかのモデルバインディングの問題が原因です。複雑なタイプ(またはなど)では機能Html.HiddenForHtml.DropDownListForません(少なくとも、デフォルトではこのようになっています)。GroupUser

また、Html.HiddenForコレクションを処理することはできません。

これらの問題を解決する方法は次のとおりです。

  • バインドする必要があるグループのプロパティごと@Html.HiddenFor(model => model.group)に1つある必要があります@Html.HiddenFor

  • 代わりに@Html.HiddenFor(model => model.users)、ユーザーのリストを反復処理し、オブジェクト@Html.HiddenForごとに、バインドする必要のあるユーザーのプロパティごとに追加する必要があります

  • の代わりに@Html.DropDownListFor(model => model.selectedUser [...]、のようなプロパティを作成int SelectedUserId {get;set;}し、DropDownListで使用します(複合型を処理できないため)。

動作するコードは次のとおりです。

1.UserGroupクラスは、私が想像したとおり、次のようになります。

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Group
{
    public int Id { get; set; }
    public string Name { get; set; }
}

2.調整されたAddUserTemplateクラス:

public class AddUserTemplate
{
    public Group Group { get; set; }
    public IList<User> Users { get; set; }

    public int SelectedUserId { get; set; }

    public User SelectedUser
    {
        get { return Users.Single(u => u.Id == SelectedUserId); }
    }
}

調整:

  • UsersICollectionインデックスによって要素にアクセスする必要があるため、からに変更されIListました(ビューコードを参照)
  • SelectedUserIdDropDownListで使用される追加のプロパティ
  • これSelectedUserは読み取り専用プロパティではなく、現在選択されているを返しますUser

3.ビューの調整済みコード:

@using (Html.BeginForm())
{
    <fieldset>
        <legend>Add an user</legend>

        @*Hidden elements for the group object*@
        @Html.HiddenFor(model => model.Group.Id)
        @Html.HiddenFor(model => model.Group.Name)

        @*Hidden elements for each user object in the users IList*@
        @for (var i = 0; i < Model.Users.Count; i++)
  {
            @Html.HiddenFor(m => m.Users[i].Id)
            @Html.HiddenFor(m => m.Users[i].Name)
  }
        <div class="editor-field">
            @*Here, we select an user from Model.users list*@
            @Html.DropDownListFor(model => model.SelectedUserId, new SelectList(Model.Users, "Id", "Name"))
        </div>
        <p>
            <input type="submit" value="Add" />
        </p>
    </fieldset>
}
于 2012-11-18T13:26:57.287 に答える
0

多数の非表示フィールドを必要としない別のオプションは、モデルをコントローラーに渡すことを指定するだけです。これはずっときれいだと思います。

@using(Html. BeginForm("action","controller", Model, FormMethod.Post)){
...
}
于 2012-11-18T14:35:06.930 に答える