5

我刚开始 MVC 所以有很多困惑。每当我们在 asp.net webform 项目中通过 jquery 调用任何服务器端函数时,该方法必须是静态的,并且必须由 webmethod 属性修饰。所以我想知道在 mvc 的情况下也适用相同的规则。

我得到了一个代码,但我没有测试它。

客户端方法

function getTradeContribs(id,pfid, nodedates) {

    var data = {};
    data.portfolioId = pfid;
    data.nodedates = nodedates;

    $.ajax({
            type: "POST",
            url: "/Portfolios/getTradeContribs/"+id,
            dataType: "json",
            data: JSON.stringify(data),
            contentType: "application/json; charset=utf-8",
            success: parseTradeContribs,
            error: function (error) {
                    alert("failed in opening XML file !!!");
            }
    });
   }

服务器端方法

public string getTradeContribs(int id,string portfolioId, string nodedates)
{
    string jsonTest = @" {""nodedates"": ""date"":""01/01/2012""}";
    return jsonTest;
}

从上面的代码我有几个问题 1)mvc 中存在多少类型的控制器方法 2)url:“/Portfolios/getTradeContribs”,它是什么类型的 url。Portfolios 是控制器名称,而 getTradeContribs 是操作名称?如果没有,那么 getTradeContribs 是一种什么样的方法。

3) getTradeContribs 没有返回 ActionResult 为什么 4) ActionResult 的意义是什么?5) 为什么 id 作为查询字符串传递,其余数据作为 json 传递。它将如何工作?

请讨论这一点,因为我是 mvc 的新手

4

2 回答 2

7

每当我们在 asp.net webform 项目中通过 jquery 调用任何服务器端函数时,该方法必须是静态的,并且必须由 webmethod 属性修饰。所以我想知道在 mvc 的情况下也适用相同的规则。

一点都不。ASP.NET MVC 是一种完全不同的模式。在 ASP.NET MVC 中,您使用返回操作结果的控制器操作(从 ActionResult 派生的类)。因此,如果您想返回 JSON,您只需定义一个返回 aJsonResult并将模型传递给它的控制器操作:

public ActionResult GetTradeContribs(int id, string portfolioId, string nodedates)
{
    var model = new 
    {
        nodedates = "foo",
        date = DateTime.Now
    };
    return Json(model, JsonRequestBehavior.AllowGet);
}

甚至更好地定义视图模型:

public class TradeContribsRequestViewModel
{
    public int Id { get; set; }
    public string PortfolioId { get; set; }
    public string NodeDates { get; set; }
}

public class TradeContribsViewModel
{
    public string NodeDates { get; set; }
    public DateTime Date { get; set; }
}

接着:

public ActionResult GetTradeContribs(TradeContribsRequestViewModel request)
{
    var model = new TradeContribsViewModel
    {
        NodeDates = "foo",
        Date = DateTime.Now
    };
    return Json(model, JsonRequestBehavior.AllowGet);
}

ASP.NET MVC 会自动将模型序列化为 JSON 字符串并将其传递给视图。然后你可以使用 ajax 调用它:

$.ajax({
    url: '@Url.Action("GetTradeContribs", "Portfolios")',
    type: 'POST',
    data: { 
        id: 123, 
        portfolioId: 'some id', 
        nodedates: 'some node dates' 
    },
    success: function(result) {
        // You could directly use the properties of the result object here
        // like for example: alert(result.nodedates);
    }
});

您绝对不应该像在原始getTradeContribs方法中那样对 JSON 进行硬编码。这是框架已经为您处理的基础设施管道。您所需要关心的只是定义:

  • 返回 ActionResult 的控制器操作
  • 控制器操作将传递给视图的模型类型
  • 一个看法
于 2012-08-06T17:42:28.677 回答
2

以下是您的问题的一些答案:

  1. mvc 中存在多少种控制器方法- 不确定您的意思。控制器中可以通过路由 URL 访问的方法称为控制器操作方法。这些方法使用 ASP.net MVC 应用程序的 Global.asax 文件中的 RouteConfig 类进行映射。
  2. url: "/Portfolios/getTradeContribs",它是什么类型的 url - 这些是宁静的 URL。MVC 框架将这些 URL 映射到控制器内的特定方法(控制器操作)。查看asp.net mvc 站点了解 MVC 的基础知识。
  3. getTradeContribs 没有返回 ActionResult 为什么- 没有必要从 Controller 操作返回 ActionResult。MVC框架提供了一些actionresults - 例如。ViewResult(显示视图)、JsonResult(返回 JSON 对象)等。在这种情况下,您可以返回字符串或 JsonResult。通过返回字符串,客户端脚本需要将其解析为 JSON 对象,如果您返回 JsonResult,则客户端脚本将使用填充的 JSON 对象。
  4. ActionResult 的意义是什么- ActionResult 是一个抽象基类,它将 Controller Action 的结果转换为各种格式(HTML、JSON、XML 等)。这只是呈现控制器操作结果的一种简单方法,或者在您的情况下将结果传递回客户端。
  5. 为什么 id 作为查询字符串传递,其余数据作为 json 传递。它将如何工作- ASP.Net MVC 框架有一个名为 Model Binder 的组件,它在调用操作方法时将尝试绑定通过查询字符串传入的值和表单 post 值,并将其绑定到方法中的参数。如果您想更改用于将值绑定到参数的逻辑,可以插入您自己的 Modelbinder。

希望这些回答你的问题。但是,在开始使用某项技术之前,您应该了解该技术/框架的基础知识。请不要将此论坛视为学习基础知识的替代品。出于这个原因,我正在贬低你的问题。

于 2012-08-06T17:43:18.163 回答