2

这是我的情况:我有一个视图(我们称之为视图V),它带有一个带有多个组合框的表单,用于选择一些参数。

我想通过 AJAX 调用动态加载这些组合框的选项(在组合框中选择一个项目将加载其他带有数据的项目)

每个组合框向框架上的不同控制器(依次调用不同模型以获取数据)发出 AJAX 请求。让我们将这些控制器称为C1C2C3和模型M1M2M3

C1C2C3上的这些 AJAX 脚本很可能在未来的其他视图上使用

但我怀疑这是否是正确的方法。我把那些 AJAX 脚本放在哪里?在每个控制器或单独的控制器上(可能称为 FormAPI 或类似的东西)

在每个控制器上放置一个 ajax 脚本我将 V 与C1C2C3耦合,而为三个请求制作一个控制器只会将我的视图 V 与一个控制器耦合。此外,从我的角度来看,这样的控制器将具有高度的凝聚力。

但是,我可能不会保持我的代码 DRY,因为C1C2C3已经有一些逻辑来接收“获取M1M2M3的列表”类型的请求,我可以将其呈现为 JSON 并将其返回到视图V

如果我有另一个视图V2需要对C1C2C3、 ... CN的请求,将来会发生什么?我想很快我的代码将是“意大利面条耦合”

你怎么看?

另一个问题:我是否应该在 M1、M2、M3 上有逻辑来获取数组和项目列表?例如,如果 M1 有多个 M2 实例,创建方法 M1->getM2asArray() 是否正确

4

1 回答 1

2

我有一个类似的案例,但它不是带有自动完成功能的组合框,所有脚本都是脚本文件夹,引用 mvc 视图中的脚本文件。

我的 MVC 上有几个自动完成功能,我添加了一个名为它AutoCompleteController的控制器(返回 Json 数据)并在布局页面上添加了 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

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)

我在博客上详细介绍过,如果您觉得有帮助,我可以放一个链接

对于第二个问题,我将按照您的建议获取每个模型中的数据并在我的自动完成控制器中调用它,以便为自动完成模板(或部分视图)提供所需的数据

于 2012-08-02T07:13:24.487 回答