2

これが私の状況です。いくつかのパラメーターを選択するための複数のコンボボックスを備えたフォームフォームを備えた単一のビュー (ビューVと呼びましょう) があります。

これらのコンボ ボックスのオプションを AJAX 呼び出しで動的に読み込みたい (コンボ ボックスで 1 つの項目を選択すると、他の項目にデータが読み込まれます)

各コンボボックスは、フレームワーク上の異なるコントローラー (データを取得するために異なるモデルを呼び出す) に対して AJAX 要求を行います。これらのコントローラーをC1C2C3、モデルをM1M2M3と呼びましょう。

C1C2、およびC3のこれらの AJAX スクリプトは、将来の他のビューで使用される可能性が非常に高いです

しかし、これが正しい方法であるかどうかは疑問です。これらの AJAX スクリプトはどこに置くのですか? 各コントローラーまたは個別のコントローラー (おそらく FormAPI などと呼ばれます)

各コントローラーに 1 つの ajax スクリプトを配置すると、V がC1C2、およびC3と結合されますが、3 つの要求に対して 1 つのコントローラーを作成すると、ビュー V と 1 つのコントローラーのみが結合されます。また、私の観点からは、そのようなコントローラーは非常にまとまりがあります。

ただし、 C1C2、およびC3には、「 M1M2、およびM3のリストを取得する」というタイプのリクエストを受け取るロジックが既にあるため、コードを DRY に保持していない可能性があります。これを JSON としてレンダリングしてビューVに返すことができます。

C1C2C3、... CNへのリクエストを必要とする別のビューV2がある場合、将来どうなりますか? すぐに私のコードは「スパゲッティ結合」になると思います

どう思いますか?

別の質問: 項目の配列とリストを取得するには、M1、M2、M3 にロジックが必要ですか? たとえば、M1 に M2 の複数のインスタンスがある場合、メソッド M1->getM2asArray() を作成するのは正しいですか?

4

1 に答える 1

2

同様のケースがありましたが、コンボボックスではなく、オートコンプリートがありました。すべてのスクリプトはスクリプトフォルダーになり、mvc ビューのスクリプトファイルを参照します。

MVC にいくつかのオートコンプリートがあり、AutoCompleteController(Json データを返す) その名前のコントローラーを 1 つ追加し、レイアウト ページに jQuery とカスタム スクリプトを追加して、すべてのページで使用できるようにしました (私のアプリケーションでは、ページの 90% がオートコンプリート)

私のオートコンプリートコントローラーの例

namespace ADM.Ntrasal.Web.UI.Browser.Controllers
{
    public class AutoCompleteController : Controller
    {
         private readonly IRepositories Repositories;
         public AutoCompleteController()
        {  //Prefare to use Ioc but for simplicity
            this.Repositories = new Repositories();
        }
        //
        // GET: /AutoComplete/

        public ActionResult EmployeeNames(string term)
        {
            var count = 10;
            var UserProfileRepostery = this.Repositories.Create<UserProfile>();


            var result = UserProfileRepostery.GetAll().Where(x =>
                  x.Employee_Name.ToLower().Contains(term.ToLower()))
              .Take(count).Select(x =>
                  new
                  {
                      label = x.Employee_Name,
                      id = x.UserID
                  });
            return Json(result, JsonRequestBehavior.AllowGet);
        }

    }
}

AutoCompleteViewModule を 1 つ作成しました

public class AutoCompleteViewModule
{
public AutoCompleteViewModule()
{
    //default values
    AutocompleteCount = 10;
    Type = AutoCompleteTypes.EmployeeNames;
}
public string Id { get; set; }
public string Name { get; set; }
public string Field { get; set; }
public int AutocompleteCount { get; set; }
public AutoCompleteTypes Type { get; set; }

オートコンプリート出力 html を管理するためのエディター テンプレートを追加しました

@model ADM.Ntrasal.UI.Web.Browser.Models.AutoCompleteViewModule
 <input type="text"  name="AutocompleteTextBox"
     data-target='@Model.Field'
     data-autocomplete="@Url.Action(@Model.Type.ToString(), 
     "AutoComplete", new { count =    @Model.AutocompleteCount })"
     value='@Model.Name' />
@Html.Hidden(@Model.Field)

オートコンプリートに必要なスクリプトを追加したくない場合は、それをオプションのセクションに入れ、オートコンプリートが必要なビューでいつでもスクリプトを参照します。

私は私の見解で以下を使用します:

@Html.EditorFor(x=>@Model.AutocompleteField)

私はこれについて詳細にブログを書きました。役に立つと思われる場合はリンクを貼ることができます

2番目の質問については、あなたが提案したように各モデルのデータを取得し、オートコンプリート コントローラーでそれを呼び出して、オートコンプリート テンプレート (または部分ビュー) に必要なデータを提供します。

于 2012-08-02T07:13:24.487 に答える