C# 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

我目前正在开发一个框架,以在MVC中生成动态视图,其想法就是基于此

下一步是添加生成多个提交按钮的可能性,但我无法让它工作。我做了一些研究,找到了一种方法。但是,由于我希望动态生成这些按钮,所以这还不起作用

我尝试在此处修改此属性代码:

[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以我需要的方式工作