2

私は次のエンティティを持っています:

public class Category
{
    public virtual int CategoryID { get; set; }

    [Required(ErrorMessage = "Section is required")]
    public virtual Section Section { get; set; }

    [Required(ErrorMessage = "Category Name is required")]
    public virtual string CategoryName { get; set; }
}

public class Section
{
    public virtual int SectionID { get; set; }
    public virtual string SectionName { get; set; }
}

これで、カテゴリの追加ビュー内に、SectionIDを入力するためのテキストボックスがあります。例:

<%= Html.TextBoxFor(m => m.Section.SectionID) %>

次のロジックを持つカスタムモデルバインダーを作成したいと思います。

モデルキーがIDで終わり、値がある場合(値がテキストボックスに挿入された場合)、親オブジェクト(この例ではセクション)をSection.GetById(入力された値)に設定します。それ以外の場合は、親オブジェクトをnullに設定します。

これはしばらくの間私を困惑させてきたので、私はここでの助けに本当に感謝します。ありがとう

4

2 に答える 2

2

IRepositoryを使用して外部キーが存在する場合はそれを埋めるモデルバインダーをこの質問に投稿しました。目的に合わせて変更することができます。

于 2010-09-03T16:42:07.153 に答える
1

dave thiebenによって投稿されたソリューションを使用して、私は次のことを思いつきました。

public class CustomModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        if (bindingContext.ModelType.Namespace.EndsWith("Models.Entities") && value != null && (Utilities.IsInteger(value.AttemptedValue) || value.AttemptedValue == ""))
        {
            if (value.AttemptedValue != "")
                return Section.GetById(Convert.ToInt32(value.AttemptedValue));
            else
                return null;
        }
        else
            return base.BindModel(controllerContext, bindingContext);
    }
}

これはうまく機能しますが、フォームがポストバックされ、ドロップダウンリストを使用するときに正しい値が選択されません。理由はわかりますが、これまでのところ、それを修正する試みは無駄でした。お役に立てれば幸いです。

于 2010-09-03T23:09:59.937 に答える