1

我想在我的控制器上有两个具有相同名称的方法,但唯一的区别是参数一个采用 T 参数,另一个采用 List

[HttpPost]
public ActionResult Edit(myType parameter)
{ 
    //snip
}

[HttpPost]
public ActionResult Edit(List<myType> parameter)
{ 
    //snip
}

该框架正在引发异常,所以我猜这是不可能的。

当前对控制器类型“MyController”的“编辑”操作请求在以下操作方法之间不明确:

我从 jQuery ajax 调用中调用这些方法,其中数据可以是 T 或 T 数组。

$.ajax({
    url: url,
    type: "POST",
    contentType: "application/json, charset=utf-8",
    dataType: "json",
    data: JSON.stringify({ parameter: data }),
    success: function () {
        //success
    },
    error: function (e) {
        //error
    }
});
4

4 回答 4

0

这里的关键是你当然可以只使用带有一个列表的重载,即使只传递一个对象,你最终也会得到一个包含 1 个项目的列表。您需要做的就是将数据作为 json 数组传入。

于 2012-07-20T15:48:31.537 回答
0

这似乎是不可能的,框架对您真正想要调用的操作感到困惑。但是,您可以简单地保持上述操作之一吗?还是每个人做不同的事情?如果是这样,那么您的 url 方案可能需要稍作修改。

如果两者或多或少做相同的事情,如果您想要“模式 1”(单个值)或“模式 2”(更多值),可以在 specy 中添加一个参数:

[HttpPost]
public ActionResult Edit(List<myType> parameter, bool? multiple)
{ 
    var multipleValues = multiple.GetValueOrDefault(true);
    if (!multipleValues)  ....
}

编辑

您可以使用自定义 ModelBinder 反序列化 json 数据。

粘合剂:

public class MyTypeBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var request = controllerContext.HttpContext.Request;

        // reset input stream
        request.InputStream.Position = 0;

        // read content
        var jsonString = request.ContentEncoding.GetString(request.BinaryRead((int)request.InputStream.Length));

        var serializer = new JavaScriptSerializer();

        return jsonString.TrimStart().StartsWith("[")
            // array, just parse it
            ? serializer.Deserialize<List<MyType>>(jsonString)
            // single object, add to a list
            : new List<MyType>() { serializer.Deserialize<MyType>(jsonString) };
    }
}

然后,关于行动:

public ActionResult Test([ModelBinder(typeof(MyTypeBinder))] List<MyType> type) 
{
   ....
}
于 2012-07-20T15:48:38.900 回答
0

弥敦道,

你可以试试这个:

[HttpPost, ActionName("Edit")]
public ActionResult EditMytype(myType parameter)
{ 
    //snip
}

[HttpPost]
public ActionResult Edit(List<myType> parameter)
{ 
    //snip
}

在项目中有类似的事情

于 2012-07-20T15:48:43.753 回答
0
[HttpPost, ActionName("EditType1")]
public ActionResult Edit(myType parameter)
{ 
    //snip
}

[HttpPost, ActionName("EditType2")]
public ActionResult Edit(List<myType> parameter)
{ 
    //snip
}

从观点来看,

/controllername/edittype1

/controllername/edittype2
于 2012-07-20T16:08:44.360 回答