【问题标题】:how to map an mvc action parameter with a value of null correctly如何正确映射值为 null 的 mvc 操作参数
【发布时间】:2013-08-22 13:33:28
【问题描述】:

我将一个序列化的字符串发布到 C# 中的 MVC 操作,其中一个空参数(即 &test=&another=10)映射到值 0.0。请问有什么建议吗?我需要将值评估为 null 而不是 0.0。下面的代码段。 非常感谢!

更新:该值可以是 10、100.00、0.0 或 null。

Ajax 帖子

$.ajax({
   type: method,
   url: url,
   data: data,
   dataType: 'json',
   success: settings.success,
   error: settings.error,
   async: !options.sync
});

MVC 控制器

[AcceptVerbs(HttpVerbs.Post)]
[NoCache]
[JsonContractExceptionFilter]
public ActionResult Save(ViewModel data)
{
    data.Test == 0.0  // should be null

模型类中的属性

public double? Test
{
   get { return obj.test; }
   set { obj.test = value; }
}

更新 2 - obj 的内容

public virtual Nullable<double> Test
{
    get;
    set;
}

更新 3

public ActionResult Save([ModelBinder(typeof(MyModelBinder))] ViewModel data)
{
   ...
}

自定义活页夹

public class MyModelBinder : DefaultModelBinder
{  
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
       var request = controllerContext.HttpContext.Request;

       // Default binder
       var temp = base.BindModel(controllerContext, bindingContext);

       // TODO - Find my property and change the value?

       return temp;
    }
}

【问题讨论】:

  • dataViewModel 不是Query,请显示相关代码。
  • 尝试使用字符串属性,然后使用Convert.ToDouble将其转换为双精度
  • obj.test 可以为空吗?
  • @Vasanth 是双倍的吗? (见底部代码sn-p)
  • 引擎盖下的 obj 是什么?有什么理由不使用自动属性?

标签: c# asp.net-mvc


【解决方案1】:

我认为这里有两个不错的选择。您可以尝试使用自定义模型绑定器(更难),也可以只检查 Request 对象中的查询字符串(更容易)。

Custom Model Binder

...或者要访问名称-值集合,请使用以下命令:

var values = HttpUtility.ParseQueryString(Request.RequestUri.Query);

ParseQueryString method on MSDN

可以帮助您的模型绑定器的示例实现将是这样的(基于您更新的问题):

public class MyModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var request = controllerContext.HttpContext.Request;

        // Default binder
        var temp = base.BindModel(controllerContext, bindingContext);

        var nulledValue = request.QueryString["test"];
        if (nulledValue == "0.0")
        {
            // cast your temp to MyInvoice and set the property here...
        }

        return temp;
    }
}

希望有帮助!

【讨论】:

  • 谢谢,但是我怎样才能轻松地覆盖使用默认活页夹的模型活页夹,然后让我的属性有问题,只需修改该值?
  • 添加了一个示例,希望对您有所帮助!
猜你喜欢
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多