3

基本ViewModelクラスから継承する子ViewModelクラスがいくつかあります。

子 ViewModel を自分の View に渡し、それ自体を部分ビューに渡します。メイン ビューは子の型を取りますが、部分ビューは親の型を取ります。

プロパティを手動で入力すると、すべてが正しく表示されます。ただし、フォームを送信すると、コントローラー アクションには Child クラスのプロパティしかありません。基本クラスのプロパティはどれも完了していませんか?

例えば

public abstract class BaseDetails
    {
        public string Name { get; set; }

        public BaseDetails()
        { }

        public BaseDetails(string name)
        {
            Name = name;
        }
    }

    public class LocalDetails:BaseDetails
    {
        public int Visits { get; set; }

        public LocalDetails()
        { }

        public LocalDetails(int visits, string name)
            :base(name)
        {
            Visits = visits;
        }
    }

ビューは次のように単純です。

@using (Html.BeginForm())
{
    @Html.TextBoxFor(m => m.Visits)
    <br />
    @Html.Partial("Name", Model)
    <input id="Submit1" type="submit" value="submit" />
}

部分ビューには 1 つのテキスト ボックスがあります。

IE: ViewSource は、form タグが両方の tetxbox を囲んでいることを示しています。

ただし、コントローラーメソッドに送信すると:

[HttpPost]
public ActionResult EditLocal (LocalDetails model)

model.Visits は正しく設定されていますが、model.Name は null ですか?

何か案は?パラメーターなしのコンストラクターをクラスに追加したのは、そうしなかった場合に送信時に例外が発生したためです。

4

1 に答える 1

7

再現できません。私にとってはうまくいきます。ビュー モデルでコンストラクターを使用していないことに注意してください。これは、モデル バインダーがコンストラクターを呼び出すことができず、すべてのプロパティにパブリックのゲッターとセッターが必要であるためです。

モデル:

public abstract class BaseDetails
{
    public string Name { get; set; }
}

public class LocalDetails : BaseDetails
{
    public int Visits { get; set; }
}

コントローラ:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new LocalDetails());
    }

    [HttpPost]
    public ActionResult Index(LocalDetails model)
    {
        return View(model);
    }
}

ビュー ( ~/Views/Home/Index.cshtml):

@model LocalDetails
@using (Html.BeginForm())
{
    @Html.TextBoxFor(m => m.Visits)
    <br />
    @Html.Partial("Name", Model)
    <input type="submit" value="submit" />
}

一部 ( ~/Views/Home/Name.cshtml):

@model BaseDetails
@Html.TextBoxFor(x => x.Name)

POST Index アクション内でフォームを送信すると、モデル プロパティ Name と Visits の両方がフォームの値に正しくバインドされます。

于 2011-06-07T06:45:12.213 に答える