11

わかりました、これは奇妙です。ASP.NETMVCで複合型のネストされたオブジェクトでBindAttribute'sIncludeとプロパティを使用できません。Exclude

これが私がしたことです:

モデル:

public class FooViewModel {

    public Enquiry Enquiry { get; set; }
}

public class Enquiry {

    public int EnquiryId { get; set; }
    public string Latitude { get; set; }
}

HTTP POSTアクション:

[ActionName("Foo"), HttpPost]
public ActionResult Foo_post(
    [Bind(Include = "Enquiry.EnquiryId")]
    FooViewModel foo) {

    return View(foo);
}

意見:

@using (Html.BeginForm()) {

    @Html.TextBoxFor(m => m.Enquiry.EnquiryId)
    @Html.TextBoxFor(m => m.Enquiry.Latitude)

    <input type="submit" value="push" />
}

まったく動作しません。BindAttributeここに記載されているようにforEnquiryクラスを定義した場合にのみ、これを機能させることができますか?

複雑なネストされたオブジェクトで[Bind(Include = "")]属性を使用するにはどうすればよいですか?

4

2 に答える 2

15

はい、次のように機能させることができます。

[Bind(Include = "EnquiryId")]
public class Enquiry 
{
    public int EnquiryId { get; set; }
    public string Latitude { get; set; }
}

そしてあなたの行動:

[ActionName("Foo"), HttpPost]
public ActionResult Foo_post(FooViewModel foo) 
{
    return View(foo);
}

EnquiryIdこれにより、バインディングに のみが含まれ、 Latitudenull のままになります。

そうは言っても、Bind 属性を使用することはお勧めできません。ビューモデルを使用することをお勧めします。これらのビュー モデル内には、この特定のビューに適したプロパティのみを含めます。

したがって、ビューモデルを再調整するだけです:

public class FooViewModel 
{
    public EnquiryViewModel Enquiry { get; set; }
}

public class EnquiryViewModel 
{
    public int EnquiryId { get; set; }
}

ほらね。バインディングを心配する必要はもうありません。

于 2012-01-17T09:57:16.647 に答える
0

IMHOこれを行うためのより良い方法があります。

基本的に、ビューモデルに複数のモデルがある場合、ポストコントローラーの署名には、ビューモデルではなく同じモデルが含まれます。

IE

public class FooViewModel {
    public Bar BarV { get; set; }
    public Enquiry EnquiryV { get; set; }
    public int ThisNumber { get; set; }
}

public class Bar {
    public int BarId { get; set; }
}

public class Enquiry {
    public int EnquiryId { get; set; }
    public string Latitude { get; set; }
}

コントローラーのポスト アクションは次のようになります。

[ActionName("Foo"), HttpPost]
public ActionResult Foo_post(
    [Bind(Include = "EnquiryId")]
    Enquiry EnquiryV,
    [Bind(Include = "BarId"])]
    Bar BarV,
    int ThisNumber
{
    return View(new FooViewModel { Bar = BarV, Enquiry = EnquiryV, ThisNumber = ThisNumber });
}

ビューがまだこのように見える間ずっと

@using (Html.BeginForm()) {

    @Html.TextBoxFor(m => m.EnquiryV.EnquiryId)
    @Html.TextBoxFor(m => m.EnquiryV.Latitude)
    @Html.TextBoxFor(m => m.BarV.BarId)
    @Html.TextBoxFor(m => m.ThisNumber)

    <input type="submit" value="push" />
}

このフォームは引き続き Latitude をポスト バックしますが (設定した方法で)、ポスト アクションの Inquiry のバインド インクルード文字列に含まれていないため、アクションは結果の新しい値を受け入れないことに注意してください。問い合わせ。追加の投稿データを防ぐために、緯度を無効にするか、フォーム要素にしないことをお勧めします。

他のシナリオでは bind を問題なく使用できますが、何らかの理由で複雑なモデルのドット表記が嫌いです。

補足として、バインド属性をクラスに直接配置することはありません。これは、コードの複製などの他の問題を引き起こす可能性があり、別のバインドが必要になる特定のシナリオを考慮していないためです。

(変数名を変更してわかりやすくしました。また、あなたの質問がかなり古いことも承知していますが、自分で答えを探しているときに、これが最初のSOであり、自分の解決策を試して投稿したものにたどり着きました。同じ問題の解決策を探している他の人を助けることができます。)

于 2015-08-28T07:17:09.693 に答える