从动作中使用ModelBinder

时间:2013-07-23 19:16:01

标签: asp.net-mvc asp.net-mvc-4 model-binding stimulsoft

我正在使用第三方报告引擎(stimulsoft)通过POST调用控制器上的操作。在表单内部,许多字段被发送给第三方的机制。在动作内部我需要一些参数我的所有参数都在URL内。

我希望能够在我的行动中使用模型活页夹。

目前,我正在使用这种方法逐一获取每个字段

var queryString = HttpUtility.ParseQueryString(Request.UrlReferrer.Query);
var preparedBy = queryString["preparedBy"];
var preparedAt = (queryString["preparedAt"] != null) ? Convert.ToDateTime(queryString["preparedAt"]) : DateTime.Today;

我更喜欢使用UrlReferrer使用模型和绑定。我创建了一个UrlReferrerValueProvider来绑定动作。我试过了,但是我在binder.BindModel行上得到了NullReferenceException

public class UrlReferrerValueProvider : NameValueCollectionValueProvider
{
    public UrlReferrerValueProvider(ControllerContext controllerContext)
        : base(HttpUtility.ParseQueryString(controllerContext.HttpContext.Request.UrlReferrer.Query), CultureInfo.InvariantCulture)
    {
    }
}

public ActionResultat GetReportSnapshot()
{
    var bindingContext = new ModelBindingContext()
        {
            ValueProvider = new UrlReferrerValueProvider(ControllerContext),
            ModelName = "MyReportModel",
            FallbackToEmptyPrefix = true
        };
    var binder = new DefaultModelBinder();
    var myReportModel = binder.BindModel(ControllerContext, bindingContext);

    [...]
    return new EmptyResult();
}

public class MyReportModel
{
    public string PreparedBy {get;set;}
    public DateTime PreparedAt {get;set;}
}

1 个答案:

答案 0 :(得分:1)

根据评论进行编辑。

public class MyReportModel
{
    public string PreparedBy {get;set;}
    public DateTime PreparedAt {get;set;}
}

public class UrlReferrerValueProvider : NameValueCollectionValueProvider
{
    public UrlReferrerValueProvider(ControllerContext controllerContext)
        : base(HttpUtility.ParseQueryString(controllerContext.HttpContext.Request.UrlReferrer.Query), CultureInfo.InvariantCulture)
    {
    }
}

public ActionResult GetReportSnapshot(MyReportModel model)
{
    this.UpdateModel(model, new UrlReferrerValueProvider(ControllerContext));

    return new EmptyResult();
}