ASP.NET MVC Controller参数自动创建对象

时间:2011-06-20 12:10:03

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

如果我有这样的自定义对象:

public class StatisticsRequest
    {
        public string Level { get; set; }
        public string Analysis { get; set; }
        ...more properties
    }

那么我可以像这样声明一个MVC2控制器吗?:

public ActionResult GetResponseStats(StatisticsRequest statsRequest)

并将我的查询字符串参数自动解析为我的自定义对象?

它不适合我 - 你能这样做吗?

修改

这是我的整个控制器类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Tradeshow.Models;

namespace Tradeshow.Controllers
{
    [Authorize]
    public class DashboardController : Controller
    {
        public ActionResult GetResponseStats(StatisticsRequest statsRequest)// string profileid, string analysis, string question, string answer, string omitheaders)
        {
            Tradeshow.Models.Mongo mongo = new Models.Mongo();
            // For top-level requests that don't specify the analysis, use the previously requested top-level analysis 
            if (statsRequest.IsTopLevelRequest)
            {
                if (statsRequest.Analysis == null || statsRequest.Analysis.Length == 0)
                {
                    statsRequest.Analysis = (String)Session["statsanalysistype"];
                }
                else
                {
                    Session["statsanalysistype"] = statsRequest.Analysis;
                }
            }
            string clientdatabasename = (String)Session["clientdatabasename"];
            Dashboard dashboard = mongo.BuildResponseDashboard(clientdatabasename,statsRequest);
            return PartialView("ProfileDashboard",dashboard);
        }
    }
}

这是我的整个StatisticsRequest对象:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Tradeshow.Models
{
    /// <summary>
    /// Encapsulates the properties that make up a statistics request for generating one or more graphs and charts
    /// </summary>
    public class StatisticsRequest
    {
        public string Level { get; set; }
        public string Analysis { get; set; }
        public string ProfileId { get; set; }
        public string Question { get; set; }
        public string Answer { get; set; }
        public string TimespanFormat { get; set; }
        public string TimespanValue { get; set; }

        public bool OmitHeaders
        {
            get
            {
                bool rc = false;

                if (String.Compare(Level, "profile", true) == 0) rc = true;

                return rc;
            }
        }

        public bool IsTopLevelRequest
        {
            get
            {
                bool rc = false;

                if (String.Compare(Level, "profile", true) == 0) rc = true;

                return rc;
            }
        }
    }
}

最简单的测试查询字符串(失败)如下所示:

/Dashboard/GetResponseStats?profileid=123&unique=775765

很多时候,只有一个或两个参数将在查询字符串中传递。

EDIT2

另一点 - StatisticsRequest对象只是一个任意对象,与View Model无关。我创建了StatisticsRequest对象,纯粹是为了封装请求,而不是支持任何基于表单的视图等。

3 个答案:

答案 0 :(得分:2)

如果您致电UpdateModel(statsRequest);,默认模型绑定器将使用查询字符串填写数据,并在属性按名称匹配时表单数据。您也可以致电TryUpdateModel(statsRequest);,只有在所有属性都可以更新时才会有效。

答案 1 :(得分:0)

假设您使用的是原始类型,模型绑定器应该能够根据传入的值构造该类型的对象.querystring参数名称需要与属性名称匹配。如果这是来自表单帖子,请确保您的输入正确命名。

最简单的方法是使用助手。

Html.TextboxFor(m => m.Level);

答案 2 :(得分:0)

书呆子的愤怒是正确的。如果你在他的例子中查看源代码,你会得到类似的东西。

<input type="text" name="StatisticsRequest.Level" />