如何将绑定路径段建模为对象属性

时间:2017-05-30 11:31:52

标签: asp.net-core asp.net-core-mvc mediatr

我有以下控制器方法,它接受命令作为从客户端传递的更改模型。

    [HttpPut]
    [Route("api/features/{name}")]
    public async Task<IActionResult> PutFeatureValueAsync(
        string name,
        [FromBody] SetFeatureCommand command,
        CancellationToken token)
    {
        command.FeatureName = name;
        await mediator.Send(command, token).ConfigureAwait(false);
        return Ok();
    }

问题是如果我想在网址中保留{name},我必须手动将FeatureName属性复制到命令对象。另一个问题是,如果在模型绑定期间未设置FeatureName,我无法正确进行验证。

使用{name}路径段以自动建模绑定到命令的FeatureName属性的最佳方法是什么。

1 个答案:

答案 0 :(得分:0)

这可以通过使用自定义模型绑定来实现。 我建议从阅读Model Binding文档开始,然后查看Custom Model Binding主题。它解释了两种可用的方法和样本几乎显示了您的需求:

  • 自定义模型绑定器(通过自己的<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/transparent" android:orientation="horizontal"> <LinearLayout android:layout_width="wrap_content" android:layout_height="62dp" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:padding="2dp" android:background="@drawable/bg_round_corner_toast" android:orientation="horizontal"> <ImageView android:layout_width="0dp" android:layout_height="match_parent" android:src="@drawable/ic_gcm_notification" android:scaleType="fitCenter" android:layout_margin="10dp" android:layout_gravity="center_vertical" android:layout_weight="2"/> <RelativeLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="8"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ixprez" android:textStyle="italic" android:textSize="12sp" android:id="@+id/tv_toast_title"/> <TextView android:layout_width="match_parent" android:layout_height="40dp" android:text="Messsage " android:layout_margin="1dp" android:maxLines="3" android:gravity="top" android:layout_gravity="left|top" android:textSize="14sp" android:textStyle="normal" android:textAlignment="center" android:textColor="@color/white" android:id="@+id/tv_toast_msg" android:layout_below="@+id/tv_toast_title" /> </RelativeLayout> </LinearLayout> </LinearLayout> 实现) 此方法需要修改模型:您需要将IModelBinder属性应用于[ModelBinder]
  • 自定义模型绑定程序提供程序(通过自己的SetFeatureCommand实现)。这就是内置框架绑定器的实现方式。然后使用MVC中间件选项注册Provider:

    IModelBinderProvider