C# MVC中的多个动态提交按钮
我目前正在开发一个框架,以在MVC中生成动态视图,其想法就是基于此 下一步是添加生成多个提交按钮的可能性,但我无法让它工作。我做了一些研究,找到了一种方法。但是,由于我希望动态生成这些按钮,所以这还不起作用 我尝试在此处修改此属性代码:C# MVC中的多个动态提交按钮,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我目前正在开发一个框架,以在MVC中生成动态视图,其想法就是基于此 下一步是添加生成多个提交按钮的可能性,但我无法让它工作。我做了一些研究,找到了一种方法。但是,由于我希望动态生成这些按钮,所以这还不起作用 我尝试在此处修改此属性代码: [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public class MultipleButtonAttribute : ActionNam
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultipleButtonAttribute : ActionNameSelectorAttribute
{
public string Name { get; set; }
public string Argument { get; set; }
public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
{
var isValidName = false;
var keyValue = string.Format("{0}:{1}", Name, Argument);
var value = controllerContext.Controller.ValueProvider.GetValue(keyValue);
if (value != null)
{
controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument;
isValidName = true;
}
return isValidName;
}
}
在调试过程中,我深入研究了ValueProvider,发现Valueproviders集合中的JQueryFormValueProvider实际上包含单击的submitbutton的名称
按钮的生成方式如下:
<input type="submit" name="buttonClick:@Model.Id" value="@Model.Text" />
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class NameToRouteDataAttribute : ActionNameSelectorAttribute
{
/// <Summary>Name of the Value you want to grab from the control.</Summary>
public string Name { get; set; }
public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
{
ValueProviderCollection providers = controllerContext.Controller.ValueProvider as ValueProviderCollection;
if (providers != null)
{
// We need this value-Provider as it contains the Data from the Form
JQueryFormValueProvider formProvider = providers.OfType<JQueryFormValueProvider>().FirstOrDefault();
if (formProvider != null)
{
// now look for the specified value-prefix.
var kvp = formProvider.GetKeysFromPrefix(Name).FirstOrDefault();
if (kvp.Key != null)
controllerContext.Controller.ControllerContext.RouteData.Values[Name] = kvp.Key;
}
}
return true;
}
}
不幸的是,ValueProviders不允许我遍历这些键,因此我不知道如何获取我在上面的屏幕截图中用红色圈出的值。
不需要采用这种方法,重要的是找出单击了哪个按钮。好的,我通过修改属性代码找到了解决方案,如下所示:
<input type="submit" name="buttonClick:@Model.Id" value="@Model.Text" />
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class NameToRouteDataAttribute : ActionNameSelectorAttribute
{
/// <Summary>Name of the Value you want to grab from the control.</Summary>
public string Name { get; set; }
public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
{
ValueProviderCollection providers = controllerContext.Controller.ValueProvider as ValueProviderCollection;
if (providers != null)
{
// We need this value-Provider as it contains the Data from the Form
JQueryFormValueProvider formProvider = providers.OfType<JQueryFormValueProvider>().FirstOrDefault();
if (formProvider != null)
{
// now look for the specified value-prefix.
var kvp = formProvider.GetKeysFromPrefix(Name).FirstOrDefault();
if (kvp.Key != null)
controllerContext.Controller.ControllerContext.RouteData.Values[Name] = kvp.Key;
}
}
return true;
}
}
按钮代码
@model MvcForms.Controls.ButtonViewModel
<input type="submit" name="buttonClick.@Model.Id" value="@Model.Text" />
这里重要的是,按钮的名称包含一个点。这使得JQueryFormValueProvider.GetKeysFromPrefix以我需要的方式工作