MVC Razor按钮

4

您好,我是新手MVC Razor。

我试图创建一个页面,其中包括3个按钮:插入、删除和更新。

我的视图如下:

        <div>    
          @using (Html.BeginForm())
           {

                <input type="button" class="button1" value="Insert" />
                <input type="button" class="button1" value="Delete" />
                <input type="button" class="button1" value="Update" /> 
           }
        </div>

我的控制器如下所示:
       public ActionResult Index()
       {
              return View();
       }

我该如何在控制器中获取这些按钮的事件,以便能够为每个按钮编写逻辑。请帮助我获取代码或任何适当的链接,以解决这个问题。

谢谢 San

4个回答

9

为按钮命名:

<div>    
 @using (Html.BeginForm())
 {
     <input type="button" name="button" class="button1" value="Insert" />
     <input type="button" name="button" class="button1" value="Delete" />
     <input type="button" name="button" class="button1" value="Update" /> 
 }
</div>

然后在您的操作中使用它:

public ActionResult Index(string button)
{
    switch (button)  
    {
        case "Insert": ...
        case "Update": ...
        case "Delete": ...       
    }

    return View();
}

尽管如此,我不会使用这种方法。我会使用jQuery来将表单动作实时修改为不同的控制器操作 (使用Url.Action) 并将其挂钩到点击处理程序上。


3
仅因为最后一句话,我点了+1。这就是为什么我讨厌网络表单的原因——不是因为技术,而是因为事件驱动思维已经洗脑了.NET网络开发人员,我们完全忘记了HTTP的真正意义。MVC的开发人员需要基本上放弃他们对Web Forms思维模式的理解。 - RPM1984
1
如果网站是多语言的,那么这个选项也会失效 - 这不是网页的初衷吗? - user156888
但是我的回答解决了这些问题 - 所以值得一提,不是吗?https://dev59.com/t1jUa4cB1Zd3GeqPPkF5#6354575 :) - user156888
另外,考虑到你所说的,你的意思是每种语言都应该有单独的保存/编辑/更新/删除操作? - user156888
2
@cvista - 听起来你渴望获得声望分数。:) 无论如何,每个CRUD操作都应该有一个单独的操作方法,最好带有适当的HTTP动词属性(REST)。URL不需要本地化,因为您之后应该会重定向(PRG)。应该本地化按钮文本。因此,应该有4个操作方法。 - RPM1984
显示剩余4条评论

3

[编辑]

为了重申我在其他答案评论中的观点:当你将逻辑绑定到C#中按钮的值时,你将你的C#代码与该语言绑定在一起。

想象一下,在英文版中,“保存”按钮的文本为:

<input type="submit" value="Insert" name='button' />

在您的代码中,您将使用该值进行切换:

public ActionResult Index(string button)
{
    switch (button)  
    {
        case "Insert": ...
        case "Update": ...
        case "Delete": ...       
    }

    return View();
}

现在,当该表单被查看为另一种语言时,你认为会发生什么?!?!
以下是威尔士语的HTML输出:
<input type="submit" value="Mewnosod" name='button' />

并且德国:
<input type="submit" value="Einfügen" name='button' />

这怎么可能运行?!

全球化不是个单独的问题!!!

如果您使用此方法,您的操作将如下所示:

public ActionResult Index(string button)
{
    switch (button)  
    {
        case "Insert": ...
        case "Update": ...
        case "Delete": ...     
        case "Einfügen": ...  
        case "Mewnosod": ....
        .... a load of other languages for each action type - 
    }

    return View();
}

请认真对待...

[/编辑]

这是我的MVC Action Selector代码:Asp.Net Mvc action selector

本质上,您需要一个动作选择器类:

/// <summary>
/// AcceptParameterAttribute to enable submit buttons to execute specific action methods.
/// </summary>
public class AcceptParameterAttribute : ActionMethodSelectorAttribute
{
    /// <summary>
    /// Gets or sets the value to use in submit button to identify which method to select. This must be unique in each controller.
    /// </summary>
    public string Action { get; set; }
 
    /// <summary>
    /// Determines whether the action method selection is valid for the specified controller context.
    /// </summary>
    /// <param name="controllerContext">The controller context.</param>
    /// <param name="methodInfo">Information about the action method.</param>
    /// <returns>true if the action method selection is valid for the specified controller context; otherwise, false.</returns>
    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
    {
        if (controllerContext == null)
        {
            throw new ArgumentNullException("controllerContext");
        }
 
        var req = controllerContext.RequestContext.HttpContext.Request;
 
        return req.Form.AllKeys.Contains(this.Action);
 
    }
}

这个功能根据你给按钮的名字来运作。

你可以装饰这些动作:

[AcceptParameter(Action = "Edit")]
public ActionResult Person_Edit(PersonViewModel model){
...
}

在操作中进行切换是不干净的 - 这种方法更加清晰。我认为这样更自然。


这是一个更新的代码版本,支持列表(数据绑定):http://blogs.sonatribe.com/wayne/2011/06/15/171/ - user156888
抱歉!我的错误 - 你需要使用可选参数方法:[AcceptParameter(Action = "Edit")]。 - user156888
我认为约定优于配置是我们社区的目标,不是吗?这就是让Ruby如此受欢迎的原因 - 也是.NET正在追赶的原因 :) - user156888
你需要将MVC的ActionName属性与我的AcceptParameter属性结合使用 - 这将告诉MVC框架如何路由您的请求: [HttpPost] [ActionName("index")] [AcceptParameter(Action = "Delete")] - user156888
已修复帖子中的链接 :) - user156888
显示剩余4条评论

2
这里是改进后的AcceptParameterAttribute,如果您像我一样使用本地化。
public class AcceptParameterAttribute : ActionMethodSelectorAttribute
{
    public string Name { get; set; }
    public Type ResourceType { set; get; }
    public string Value { get; set; }

    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
    {
        HttpRequestBase request = controllerContext.RequestContext.HttpContext.Request;
        if (ResourceType != null)
        {
            ResourceManager resourceManager = new ResourceManager(ResourceType);
            return request.Form[Name] == resourceManager.GetString(Value);
        }
        return request.Form[Name] == Value;
    }
}

使用方式类似于DisplayAttribute

[AcceptParameter(ResourceType = typeof(Resources), Name = "submit", Value = "Search")]

和按钮

<input type="button" name="submit" value="@Resources.Search" />

1

我建议你阅读一些关于MVC3的简单教程 - 这将为你提供了解MVC框架基本原理的机会。你可以从这里开始。

现在回答你的问题:最好的方法是从每个按钮中调用控制器中的某些操作。

@Html.ActionLink("Insert", "Insert") 

或者

@Html.ActionLink("Edit", "Edit", new{Id=lineId}).

然后,当用户点击此链接时,他将进入正确的视图,该视图已准备好处理该任务。


你认为这将如何发布到一个操作?HTTP GET 不是 POST ! - user156888
你认为为什么需要POST? - VikciaR
表单字段还能以其他方式发送到服务器吗?您是否误解了OP的意图? - user156888
1
我没有看到任何表单字段。我认为没有必要使用三个提交按钮来处理单个表单。从OP的问题中,我们可以看出他想做什么,但最好解释一下他应该如何更好地完成。当然,他可能确实需要像你在答案中提供的那样的东西:你的答案被选中了 - 所以也许是正确的。顺便说一句,我的答案基于部分内容:“我是Razor新手”,所以答案应该是基础的 :-) - VikciaR
我认为表单字段是隐含的 :) - user156888

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接