【问题标题】:Multiple dynamic Submitbuttons in MVCMVC 中的多个动态提交按钮
【发布时间】:2014-11-29 19:57:35
【问题描述】:

我目前正在开发一个在MVC中生成动态Views的Framework,思路就是基于这个tutorial

下一步是添加生成多个提交按钮的可能性,但我无法让它工作。我做了一些研究,发现this 方法。但是,由于我想动态生成这些按钮,所以这还不行。

我尝试的是在这里修改这个属性代码:

[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实际上包含了点击提交按钮的名称。

按钮是这样生成的:

<input type="submit" name="buttonClick:@Model.Id" value="@Model.Text" />

不幸的是,ValueProviders 不允许我遍历键,所以我不知道如何获得我在上面的屏幕截图中用红色圈出的值。 不需要是这种方法,重要的是,找出点击了哪个按钮。

【问题讨论】:

    标签: c# asp.net-mvc-4


    【解决方案1】:

    好的,我通过像这样修改属性代码找到了解决方案:

    [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;
        }
    }
    

    控制器代码:

        [HttpPost]
        [NameToRouteDataAttribute(Name = "buttonClick")]
        public ActionResult Show(FormViewModel form)
        {
            string buttonId = RouteData.GetRequiredString("buttonClick");
    
            ...
        }
    

    按钮代码

    @model MvcForms.Controls.ButtonViewModel
    <input type="submit" name="buttonClick.@Model.Id" value="@Model.Text" />
    

    这里重要的是,Button 的名称包含一个点。这使得 JQueryFormValueProvider.GetKeysFromPrefix 按我需要的方式工作。

    【讨论】:

      猜你喜欢
      • 2016-08-02
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多