5

我正在尝试将一个 int 数组从 JavaScript 传递到一个接受 2 个参数的 MVC 控制器——一个 int 数组和一个 int。这是对控制器操作返回的视图执行页面重定向。

var dataArray = getAllIds(); //passes back a JavaScript array 
window.location.replace("/" + controllerName + "/EditAll?ids=" + dataArray + "&currentID=" + dataArray[0])

dataArray 包含 1,7 作为我的示例使用的预期。

控制器代码

public virtual ActionResult EditAll(int[] ids, int currentID)
{

  currentModel = GetID(currentID);
  currentVM = Activator.CreateInstance<ViewModel>();
  currentVM.DB = DB;
  currentVM.Model = currentModel;
  currentVM.ViewMode = ViewMode.EditAll;
  currentVM.ModelIDs = ids;

  if (currentModel == null)
  {
      return HttpNotFound();
  }

  return View("Edit", MasterName, currentVM);
}

问题是当检查传递给控制器​​的 int[] id 时,它的值为 null。currentID 按预期设置为 1。

我尝试设置 jQuery.ajaxSettings.traditional = true ,但没​​有效果我还尝试在 JavaScript 中使用 @Url.Action 创建服务器端 url。在传递数组之前,我还尝试了 JSON.Stringify,例如

window.location.replace("/" + controllerName + "/EditAll?ids=" + JSON.stringify(dataArray) + "&currentID=" + dataArray[0])

id 数组在控制器端再次变为 null。

有没有人有任何关于让 int 数组正确传递给控制器​​的指针?我可以在 Controller Action 中将参数声明为 String 并手动序列化和反序列化参数,但我需要了解如何让框架自动进行简单的类型转换。

谢谢!

4

1 回答 1

12

要在 MVC 中传递一个简单值的数组,您只需为多个值赋予相同的名称,例如 URI 最终看起来像这样

/{controllerName}/EditAll?ids=1&ids=2&ids=3&ids=4&ids=5&currentId=1

MVC 中的默认模型绑定会将 this 正确绑定到 int 数组 Action 参数。

现在,如果它是一个复杂值的数组,则可以采用两种方法进行模型绑定。假设您有这样的类型

public class ComplexModel
{
    public string Key { get; set; }

    public string Value { get; set; }
}

和控制器动作签名

public virtual ActionResult EditAll(IEnumerable<ComplexModel> models)
{
}

为了正确绑定模型,值需要在请求中包含索引器,例如

/{controllerName}/EditAll?models[0].Key=key1&models[0].Value=value1&models[1].Key=key2&models[1].Value=value2

我们在int这里使用索引器,但您可以想象这在应用程序中可能非常不灵活,其中在 UI 中呈现给用户的项目可以在集合中的任何索引/槽处添加和删除。为此,MVC 还允许您为集合中的每个项目指定自己的索引器,并将该值与默认模型绑定的请求一起传递以使用,例如

/{controllerName}/EditAll?models.Index=myOwnIndex&models[myOwnIndex].Key=key1&models[myOwnIndex].Value=value1&models.Index=anotherIndex&models[anotherIndex].Key=key2&models[anotherIndex].Value=value2

在这里,我们指定了我们自己的索引器,myOwnIndexanotherIndex用于模型绑定以绑定复杂类型的集合。据我所知,您可以为索引器使用任何字符串。

或者,您可以实现自己的模型绑定器来指示传入请求应如何绑定到模型。这比使用默认框架约定需要更多的工作,但确实增加了另一层灵活性。

于 2013-09-02T14:28:44.177 回答