0

別のモデルのリストを持つこのモデルがあります。次に、私の見解では、メイン モデルのいくつかのフィールドに入力するフォームがあります。しかし、私はこのフォームに他のタイプの X モデルも追加できるようにして、すべて配線できるようにしたいと考えています。これを適切に行う方法を考えています。

だからここに私の2つのモデルがあります:

public class MyMainModel
{

    public int MyMainId { get; set; }

    [Required(ErrorMessage = "Groovy name required")]
    [Display(Name = "MyMainModel's groovy name:")]
    public string Name { get; set; }

    public List<MySubModel> MySubModels { get; set; }

}

public class MySubModel
{

    public int MySubId { get; set; }

    [Required(ErrorMessage = "Cool name required")]
    [Display(Name = "MySubModel's cool name:")]
    public string Name { get; set; }

}

「作成」ビューのコントローラーを押すと、次のアクションが実行されます。

public ActionResult SomePageAboutCreating()
{
    // [...] Some other stuff
    return View(new MyMainModel());
}

これで、強く型付けされたビューに送信されます。

@model myFunProject.WebModels.MyMainModel

<div>
    <form id="my-create-form" onsubmit="CreateMyMainModel(this); return false;">
        @Html.AntiForgeryToken()
        @Html.ValidationSummary()

        <div class="result" style="background-color: silver;">This is the operation result box</div>
        <img class="loading" src="/Images/ajax-loader.gif" alt="Loading..." width="16" height="16" style="display: none;" />

        <section>
            @Html.LabelFor(m => m.Name)
            @Html.TextBoxFor(m => m.Name)
            @Html.ValidationMessageFor(m => m.Name)
        </section>

        <!-- Here begins the fields for my list of "MySubModel" -->
        @Html.EditorFor(x => x.MySubModels)

        <!-- Here I'm thinking about a javascript that will add the previous fields X times so that the user can create "MyMainModel" as well as x times "MySubModel"... -->

        <input type="submit" class="btn-send" id="my-create-form-submit" value="Send" />
    </form>
</div>

ここで EditorTemplates を使用する必要があると思います... /Views/EditorTemplates/MySubModels.cshtml (「MyMainModel」のプロパティに対して名前が付けられています) でセットアップし、そこにフォームを書き込むと、混乱している...

@model myFunProject.WebModels.MyMainModel

@*<section>
    @Html.LabelFor(m => m.Name)
    @Html.TextBoxFor(m => m.Name)
    @Html.ValidationMessageFor(m => m.Name)
</section>*@

だからここに何を入れたらいいのかわからない... Name プロパティを「MySubModel」のプロパティにしたい。そして、ユーザーがこのフォームを見たときに、たとえば次のシナリオを実行するとします。

  1. 「MyMainModel」の名前を入力します。
  2. 別の名前ボックスに移動し、"MySubModel.
  3. 次に、dom を操作して別の MySubModel.Name フィールドを追加する特別なボタンをクリックします。
  4. 彼は 2 番目の「MySubModel」名を書きます。
  5. 彼は送信をクリックします。

そこに配置した ajax 呼び出しを接続しても問題ありませんが、エディター テンプレート用に記述しなければならないコードに混乱が生じ、新しいテンプレートをどのように作成するかについても考えていますフィールド (たとえば、その 2 番目の「MySubModel」の場合...)。

これに近い主題に関する多くの記事を調べましたが、まだこのケースを見つけていません。ありがとう!

編集:

フォームが送信されたときに ajax によって呼び出されるアクション (非常に単純化されたバージョンです) を追加します。

public ActionResult CreateMyMainModel(MyMainModel myMainModel) {

    // [...] Do stuff like save to database...
    // var aGroovyNAme = myMainModel.Name;

    foreach(var mySubModel in myMainModel.MySubModels) {
        // Here I would have the sub models available to manipulate...
        // var aCoolName = mySubModel.Name;
    }
    return Content("ok");

}
4

3 に答える 3

1

私はこれに近い話題について多くの記事を読んできましたが、まだこのケースを見つけていません.

editing a variable length listこのシナリオを処理するための非常に優れたアプローチを示している Steven Sandersonの記事を読むことを強くお勧めします。Html.BeginCollectionItem彼は、入力フィールド名の非シーケンシャル インデックス (GUID) を生成するために使用できるカスタム ヘルパーを提示し、インデックスにを残さずに要素を動的に簡単に削除できるようにします。ユーザーが別のアイテムを追加することを決定すると、空のテンプレート (部分的) を返すだけのコントローラー アクションに対して AJAX 呼び出しが行われます。

また、javascript のみを使用して、純粋にクライアント側でこれを行うこともできます。Steven Sanderson は、knockoutjs を使用したこのアプローチを で説明しましたthis similar article

これら 2 つの記事は、ASP.NET MVC で項目の可変長リストを動的に編集するという点で、実際に最良の方法です。それらを読むことは、ASP.NET MVC のモデル バインディングのいくつかのコア概念をよりよく理解するのに非常に役立ちます。

于 2013-03-12T22:07:48.243 に答える
0

プロジェクトで同様の問題があり、いくつかのフィールドを場合によっては検証し、他のフィールドでは検証したくありませんでした (つまり、保存時には検証しませんが、送信時にはすべてを検証します。

結局、すべてを JavaScript で手動で行い、json オブジェクトをポストバックしました。

振り返ってみると、検証JavaScriptファイル(MicrosoftMVCValidation.js)を操作したかったのです。

モデル バインディングの問題については、カスタム モデル バインディングを検討することをお勧めします。

特に部分ビューでは、EditorTemplates の使用が少し面倒であることがわかりました。

asp.net mvc 3 は、モデル バインディングが少し弱いことがわかりました。いくつかの問題が mvc 4 で修正されることを望んでいましたが、これまで見てきたことから、MVC4 は主に Windows Phone アプリケーションを作成するためのアップグレードです。

モデル内の小数プロパティのカスタム モデル バインダーの例を次に示します。

独自のカスタム モデルで同じロジックを使用できます。

たとえば、プロパティの基本的なコレクションをバインドするだけでなく、モデルを大きなページのエンティティのコレクションにバインドしたい場合があることがわかりました。

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

        //return valueProviderResult == null ? base.BindModel(controllerContext, bindingContext) : Convert.ToDecimal(valueProviderResult.AttemptedValue);


       if (valueProviderResult == null)
           return base.BindModel(controllerContext, bindingContext);
       else if (valueProviderResult.AttemptedValue == "")
           return base.BindModel(controllerContext, bindingContext);
       else
           return Convert.ToDecimal(valueProviderResult.AttemptedValue);

    }
}  
于 2013-03-12T23:46:45.540 に答える
0

私は最近、別のスレッドでこの正確な質問にほとんど答えました:

ASP.Net MVC4 は、リストを含むモデルに「ビューの作成」をバインドします

于 2014-08-04T20:30:47.400 に答える