gpt4 book ai didi

javascript - 将逗号分隔值传递给 ASP.NET MVC 操作方法

转载 作者:太空宇宙 更新时间:2023-11-03 21:00:49 26 4
gpt4 key购买 nike

好的,所以我基本上有一个 ajax 调用从 html 选择多个标签中检索值...事情是我无法将这些值传递到我的 Controller 中(我在我的 Controller 中得到一个空引用)

在 ajax 调用中检查 types: $('select#opt2').val()avion: $('select#opt1').val() 不是多值,所以它工作正常。当我 alert($('select#opt2').val()) 时,我得到如下值:GC、VSG、AA7...(它们由“,”分隔)

这是我的代码:

AJAX

$('select#opt2').change(function () {
$.ajax({
url: '@Url.Action("RetournerPostes", "Home", new { area = "Avion" })',
data: { avion: $('select#opt1').val(), types: $('select#opt2').val() },
type: 'POST',
dataType: 'JSON',
//Rest of code

控制者这是我获得变量“类型”的空引用的地方

[HttpPost]
public async Task<ActionResult> RetournerPostes(string avion,List<string> types)
{
//Rest of action

如果您需要更多信息,请告诉我。谢谢!

编辑

添加 fiddle :https://jsfiddle.net/f73jxo5v/

最佳答案

如果您大量绑定(bind)逗号分隔值 (CSV),最简单且可维护的方法是创建一个名为 CommaSeparatedModelBinder 的自定义模型绑定(bind)器

捕获 select 的更改事件并在用户选择选项时进行 Ajax 调用并不常见。但这取决于你。

enter image description here

enter image description here

[HttpGet]
public ActionResult RetournerPostes()
{
return View();
}

[HttpPost]
public ActionResult RetournerPostes(string avion,
[ModelBinder(typeof(CommaSeparatedModelBinder))] int[] types)
{
return View();
}

查看

@using (Html.BeginForm())
{
<select id="opt1">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>

<select id="opt2" multiple>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
<input type="submit" value="Submit"/>
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script type="text/javascript">
$('select#opt2').change(function () {
var data = JSON.stringify({ avion: $('select#opt1').val(), types: $('select#opt2').val() });
console.log(data);
$.ajax({
url: '@Url.Action("RetournerPostes", "Home")',
data: data,
type: 'POST',
contentType: "application/json",
dataType: 'JSON',
success: function(msg) {
console.log(msg);
}
});
});
</script>

CommaSeparatedModelBinder

public class CommaSeparatedModelBinder : DefaultModelBinder
{
private static readonly MethodInfo ToArrayMethod = typeof(Enumerable).GetMethod("ToArray");

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
return BindCsv(bindingContext.ModelType, bindingContext.ModelName, bindingContext)
?? base.BindModel(controllerContext, bindingContext);
}

protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
{
return BindCsv(propertyDescriptor.PropertyType, propertyDescriptor.Name, bindingContext)
?? base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
}

private object BindCsv(Type type, string name, ModelBindingContext bindingContext)
{
if (type.GetInterface(typeof(IEnumerable).Name) != null)
{
var actualValue = bindingContext.ValueProvider.GetValue(name);

if (actualValue != null)
{
var valueType = type.GetElementType() ?? type.GetGenericArguments().FirstOrDefault();

if (valueType != null && valueType.GetInterface(typeof(IConvertible).Name) != null)
{
var list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(valueType));

foreach (var splitValue in actualValue.AttemptedValue.Split(new[] { ',' }))
{
if (!String.IsNullOrWhiteSpace(splitValue))
list.Add(Convert.ChangeType(splitValue, valueType));
}

if (type.IsArray)
return ToArrayMethod.MakeGenericMethod(valueType).Invoke(this, new[] { list });

return list;
}
}
}

return null;
}
}

原始来源:CommaSeparatedModelBinder.cs

关于javascript - 将逗号分隔值传递给 ASP.NET MVC 操作方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45735637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com