1

モデルには 2 つのプロパティがあり、そのうちの 1 つは別のクラスのオブジェクトです

  public class Association : Entity
{
    public Association()
    {
        this.User = new User();
    }

    public User User
    {
        get;
        set;
    }

    public Role Role
    {
        get;
        set;
    }
};

私のビューはこのモデルに強く型付けされています

@model MuddyBoots.Greenlight.Association
.
.
@using (Html.BeginForm())
{

@Html.ValidationSummary(true)
    <div>
     @Html.TextBoxFor(model => model.User.FirstName,new { id = "first-name" })
    <span class="red-asterisk">@Html.ValidationMessageFor(model =>    model.User.FirstName)</span>
 </div>
   <div>
    @Html.HiddenFor(model => model.Role, new { id="hiddenRole"})
        <ul id="user-roles">
            <li><input type="radio" name="user-role" id="role-admin" value="01" checked="checked" /> Read only</li>
            <li><input type="radio" name="user-role" id="role-member" value="02" /> Restricted</li>
            <li><input type="radio" name="user-role" id="role-read" value="03"/> Standard</li>
            <li><input type="radio" name="user-role" id="role-subscriber" value="04" /> Administrator</li>
        </ul>
</div>
}

私のコントローラー関数は次のように書かれています:

[HttpPost]
    public ActionResult AddUser(Association association)
    {
        string firstName = association.User.FirstName;
        var role = association.Role;

         IRepository<Association> associationRepository = new IRepository<Association>(db);
        if (ModelState.IsValid)
        { 
           siteRepository.Update(site);
            return RedirectToAction("Index");
        }
        return View(association);
    }

私の問題は次のとおりです。ビューを投稿すると、関連オブジェクトがnullになり、値がありません。

より正確に言うと、次の 2 行をデバッグしようとすると、次のようになります。

 string firstName = association.User.FirstName;
 var role = association.Role;    

それらの値は null ですが、最初の行をコメントすると、ロール変数に値が含まれています。問題が User プロパティに関連していることを感じていますが、解決方法がわかりません。

4

2 に答える 2

3

Role タイプにいくつかの非表示フィールドを使用しているようです。

@Html.HiddenFor(model => model.Role, new { id = "hiddenRole" })

ただし、Role プロパティは複合型であるため、隠しフィールドとしてシリアル化することはできません。送信するプロパティごとに隠しフィールドを使用する必要があります。

@Html.HiddenFor(model => model.Role.Property1)
@Html.HiddenFor(model => model.Role.Property2)
@Html.HiddenFor(model => model.Role.Property...)

また、名前付きのフォーム内でいくつかのラジオボタンを使用しているようですがuser-role、Role クラスにこの名前のプロパティを設定することはできません (プロパティ名にダッシュを含めることはできません)。そのため、適切な名前を使用する必要があると思います。これらのラジオ ボタンの値を、Association モデルの Role クラスのプロパティにバインドする場合は、ここを参照してください。

たとえば、Role クラスが次のようになっているとします。

public class Role
{
    public string Value { get; set; }
}

ビューは次のようになります。

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <div>
        @Html.TextBoxFor(model => model.User.FirstName, new { id = "first-name" })
        <span class="red-asterisk">
            @Html.ValidationMessageFor(model => model.User.FirstName)
        </span>
    </div>
    <div>
        <ul id="user-roles">
            <li>
                @Html.RadioButtonFor(model => model.Role.Value, "01", new { id = "role-admin" }) 
                Read only
            </li>
            <li>
                @Html.RadioButtonFor(model => model.Role.Value, "02", new { id = "role-member" }) 
                Restricted
            </li>
            <li>
                @Html.RadioButtonFor(model => model.Role.Value, "03", new { id = "role-read" }) 
                Standard
            </li>
            <li>
                @Html.RadioButtonFor(model => model.Role.Value, "04", new { id = "role-subscriber" }) 
                Administrator
            </li>
        </ul>
    </div>

    <button type="submit">OK</button>
}
于 2013-02-03T17:15:42.867 に答える
1

ModelBinder が子オブジェクトをバインドするとは思わない。カスタム ModelBinder を作成して Association クラスをバインドするか、現在のモデルを単一のクラスにフラット化する ViewModel クラスを作成することができます。したがって、AssociationViewModel モデル クラスは次のようになります。

public class AssociationViewModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string RoleName { get; set; }
}


public ActionResult AddUser(AssociationViewModel associationViewModel)
{
    if (ModelState.IsValid)
    { 
        var association = new Association
        {
            User.FirstName = associationViewModel.FirstName,
            Role = new Role { Name = associationViewModel.RoleName }
        };

        IRepository<Association> associationRepository = new IRepository<Association>(db);
        ....
    }
 }
于 2013-02-03T17:29:18.827 に答える