【问题标题】:Using ModelBinder from action从操作中使用 ModelBinder
【发布时间】:2013-07-24 22:24:14
【问题描述】:

我正在使用第三方报告引擎 (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;}
}

【问题讨论】:

  • 我已经尝试将 MyReportModel 作为参数添加到 GetReportSnapshot 方法中,但这不起作用
  • “我的所有参数都在 URL 内”。这是否意味着它们在查询字符串中?如果是这种情况,则报告引擎不会通过 POST 调用 Action。请为您的视图提供代码。
  • 我没有视图的代码,调用是从第三方发出的。参数不在查询字符串中,但在 URL 中,我只能在 HttpContext.Request.UrlReferrer 中获取这些参数
  • 你能举例说明参数是如何在 URL 中传递给你的 Action 的吗?
  • 在 HttpContext.Request.UrlReferrer 的操作中包含:dev/Report/Index/… 使用 HttpUtility 我可以将其解析为 queyrstring,但这些值在“ModelBinding 阶段”期间不在查询字符串中,因为它是发布到 dev/Report/Index/1

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


【解决方案1】:

根据 cmets 编辑。

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();
}

【讨论】:

  • 这不起作用,因为参数不是作为查询字符串或表单的一部分发送的,它们仅在 UrlReferrer 内部。另外,Url Referrer 没有在“模型绑定阶段”填充,所以我不能只在 DefaultModelBinder 的 BindingContent 中添加 UrlReferrerValueProvider
  • 谢谢,不知何故我错过了。使用 UrlReferrer 编辑我的答案以反映。
  • 谢谢,UpdateModel 那是我缺少的部分!
猜你喜欢
  • 1970-01-01
  • 2018-06-26
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多