如何在 ASP.NET MVC 中执行辅助操作(即计算字段)?

Posted

技术标签:

【中文标题】如何在 ASP.NET MVC 中执行辅助操作(即计算字段)?【英文标题】:How do I perform a secondary action (i.e. calculate fields) in ASP.NET MVC? 【发布时间】:2009-03-16 07:06:33 【问题描述】:

我需要对 ASP.NET MVC 视图进行一些计算,这是一个不同于表单提交的操作。我尝试了各种通过 ActionLink 将当前模型传递给新控制器操作的方法,但模型似乎没有被传递。

public ActionResult Calculate(MuralProject proj)

    ProjectFormRepository db = new ProjectFormRepository();
    List<Constant> constants = db.GetConstantsByFormType(FormTypeEnum.Murals);

    proj.Materials = new MuralMaterials();
    proj.Materials.Volunteers = this.GetVolunteerCount(constants, proj);

    this.InitializeView(); 
    return View("View", proj);

我的 html.ActionLink 语法需要什么才能调用它并使返回的视图具有相同的模型数据(具有计算的更改)?或者,还有另一种方法可以做到这一点吗?

我也尝试了 Ajax.ActionLink 方法,但遇到了同样的问题

编辑:“给你的提交按钮一个名字,然后在你的控制器方法中检查提交的值”here 显示的方法是我正在寻找的。​​p>

【问题讨论】:

【参考方案1】:

[看到你的cmets;我将在此处重新发布此答案,以便您可以将问题标记为已解决,并将其标记为社区 wiki,这样我就不会获得代表 - Dylan]

为您的提交按钮命名,然后在您的控制器方法中检查提交的值:

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" name="submitButton" value="Send" />
<input type="submit" name="submitButton" value="Cancel" />
<% Html.EndForm(); %>

发帖到

public class MyController : Controller 
    public ActionResult MyAction(string submitButton) 
        switch(submitButton) 
            case "Send":
                // delegate sending to another controller action
                return(Send());
            case "Cancel":
                // call another action to perform the cancellation
                return(Cancel());
            default:
                // If they've submitted the form without a submitButton, 
                // just return the view again.
                return(View());
        
    

    private ActionResult Cancel() 
        // process the cancellation request here.
        return(View("Cancelled"));
    

    private ActionResult Send() 
        // perform the actual send operation here.
        return(View("SendConfirmed"));
    


【讨论】:

如果我们不得不做这样的事情,这很令人沮丧,“关注点分离”的论点发生了什么?微软 hoo haa 营销花言巧语!我很沮丧,这是一个框架可以为这种常见场景提供的最好的方法 您觉得哪些问题没有被明确区分?如果魔术字符串困扰您,可以轻松设置包含按钮标题和值的静态类或外部资源文件,这样您就不必依赖魔术字符串比较。 如何将数据传递给适当的操作?【参考方案2】:

一个动作链接只是链接到一个动作。它转换为&lt;a href="action"&gt;action&lt;/a&gt; 标签。它链接到的操作不知道它刚刚离开的页面的状态。

您可能应该“发布”到一个动作,但它只会发送表单数据,而不是一个对象(尽管 mvc 可以自动将表单字段映射到一个对象)。

【讨论】:

好的,这可能会有所帮助。如果我正在做的不是表单提交,我似乎无法弄清楚如何将表单数据映射到对象。 我有一组字段与一些基于服务器的计算相结合以填充另一组字段。所有字段都在模型中 因此将修改后的字段发布到新操作,并发布要更新的模型的标识符。在您的操作中,根据标识符加载模型,然后替换为修改后的值?

以上是关于如何在 ASP.NET MVC 中执行辅助操作(即计算字段)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET MVC 中的控制器之外生成 URL?

ASP.NET MVC - 操作名称如何影响 url?

在asp.net mvc中每天执行一次操作[重复]

(转)表单和HTML辅助方法 - ASP.NET MVC 3

Creating Custom Helper Methods 创建自定义辅助器方法----辅助器方法 ------ 精通ASP.NET MVC 5

在 Asp.Net MVC 中设置“主页”