8

我有一个地址簿控制器,它将返回一个“文件夹”列表(基本上是组/位置)。这可以通过 AJAX 请求或在渲染时在 MVC 页面本身内调用。

如何创建一个适用于这两种情况的函数?这是我当前的控制器操作,我似乎很难在我的 MVC 页面中使用它

public ActionResult GetFolderList(int? parent)
{
    List<String> folderList = new List<String>();
    folderList.Add("East Midlands");
    folderList.Add("West Midlands");
    folderList.Add("South West");
    folderList.Add("North East");
    folderList.Add("North West");

    return Json(folderList);
}

在页面内(不工作 atm)

@{
    var controller = new My.Controllers.AddressBookController();
    var what = controller.GetFolderList(0);

    foreach(var p in what){
        //i want to get the list items here
    }
}
4

4 回答 4

9

只需有一个返回 的函数List,然后在页面加载和 AJAX 请求 Action 方法中调用它。

就像是:

public List<string> GetFolderList()
{
    List<String> folderList = new List<String>();
    folderList.Add("East Midlands");
    folderList.Add("West Midlands");
    folderList.Add("South West");
    folderList.Add("North East");
    folderList.Add("North West");

    return folderList;
}

然后在页面加载时,您可以将其粘贴到您的模型中:

public ActionResult Index()
{
    var model = new YourViewModel(); //whatever type the model is

    model.FolderList = GetFolderList(); //have a List<string> called FolderList on your model

    return View(model); //send model to your view
}

然后在您看来,您可以执行以下操作:

@model YourViewModel

@{
    foreach(var item in Model.FolderList){
        //do whatever you want
    }
}

然后,假设您的 ajax 请求类似于:

$.ajax({
    url: '@Url.Action("GetFolders", "ControllerName")',
    type: 'POST',
    datatype: 'json',
    success: function (result) {
        for (var i = 0; i < result.length; i++)
        {
            //do whatever with result[i]
        }
    }
});

您的GetFolders操作方法如下所示:

public ActionResult GetFolders()
{
    return Json(GetFolderList());
}
于 2013-05-23T14:55:09.323 回答
5

这将起作用:

public ActionResult GetFolderList(int? parent)
{
    List<String> folderList = new List<String>();
    folderList.Add("East Midlands");
    folderList.Add("West Midlands");
    folderList.Add("South West");
    folderList.Add("North East");
    folderList.Add("North West");

    if(Request.IsAjaxRequest())
    {
        return Json(folderList);
    }

    return View("someView", folderList );

}
于 2013-05-23T14:55:00.440 回答
2

首先,在你看来,你永远不应该做这样的事情:

var controller = new My.Controllers.AddressBookController();
var what = controller.GetFolderList(0);

这会在视图和控制器之间产生紧密耦合,这几乎违反了 MVC 的原则。现在,回答你的问题。

正如 mattytomo 所暗示的,您将希望使用强类型视图并从视图模型中获取您的列表。像下面这样的东西适用于简单的情况。如果此视图变得更复杂,那么您将需要一个实际的视图模型对象:

@model List<string>

@{
  foreach (var p in Model)
  {
      p;
  }
}

现在,正如 Maris 所指出的,您可以使用 AJAX 或普通请求的一种控制器方法以及使用 Request.IsAjaxRequest。假设您的视图名为“FolderList”,控制器操作将如下所示:

    public ActionResult GetFolderList(int? parent)
    {
        List<String> folderList = new List<String>();
        folderList.Add("East Midlands");
        folderList.Add("West Midlands");
        folderList.Add("South West");
        folderList.Add("North East");
        folderList.Add("North West");

        if (Request.IsAjaxRequest())
        {
            return Json(folderList);
        }

        return View("FolderList", folderList);
    }

现在,当您通过 AJAX 调用此方法时,它将返回 folderList 的 JSON 表示,否则它将返回您的 FolderList 视图。

于 2013-05-23T15:44:27.440 回答
0

我曾经写过一个ActionFilter这样做的,一旦http 标头包含它就会覆盖ActionResultwith (并且可以通过传递with将自身限制为仅 Ajax 请求):JsonResultAcceptjsononAjaxOnlytrue

public class ReturnJsonIfAcceptedAttribute : ActionFilterAttribute
{
    private bool _onAjaxOnly;
    private bool _allowJsonOnGet;

    public ReturnJsonIfAcceptedAttribute(bool onAjaxOnly = true, bool allowJsonOnGet = false)
    {
        _onAjaxOnly = onAjaxOnly;
        _allowJsonOnGet = allowJsonOnGet;
    }

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        var request = filterContext.HttpContext.Request;

        if (!_allowJsonOnGet && request.HttpMethod.ToUpper() == "GET")
            return;

        var isAjax = !_onAjaxOnly || request.IsAjaxRequest();

        if (isAjax && request.AcceptTypes.Contains("json", StringComparer.OrdinalIgnoreCase))
        {
            var viewResult = filterContext.Result as ViewResult;

            if (viewResult == null)
                return;

            var jsonResult = new JsonResult();
            jsonResult.Data = viewResult.Model;

            filterContext.Result = jsonResult;
        }
    }

然后你保持Action原样,你只需附加新的ReturnJsonIfAccepted Attribute

[ReturnJsonIfAccepted]
public ActionResult Index()
{
    var model = new Model(); // whatever
    return View(model);
}
于 2013-05-23T15:47:54.297 回答