如果我有这样的自定义对象:
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对象,纯粹是为了封装请求,而不是支持任何基于表单的视图等。
答案 0 :(得分:2)
如果您致电UpdateModel(statsRequest);
,默认模型绑定器将使用查询字符串填写数据,并在属性按名称匹配时表单数据。您也可以致电TryUpdateModel(statsRequest);
,只有在所有属性都可以更新时才会有效。
答案 1 :(得分:0)
假设您使用的是原始类型,模型绑定器应该能够根据传入的值构造该类型的对象.querystring参数名称需要与属性名称匹配。如果这是来自表单帖子,请确保您的输入正确命名。
最简单的方法是使用助手。
Html.TextboxFor(m => m.Level);
答案 2 :(得分:0)
<input type="text" name="StatisticsRequest.Level" />