将帖子参数映射到模型

时间:2013-08-04 18:04:54

标签: c# .net asp.net-mvc asp.net-mvc-4

我有一个模型,我想用它来与外部Web服务进行通信。它应该在我的网站上调用特定的帖子。

public class ConfirmationModel{
    ...
    public string TransactionNumber {get; set;}
}

public ActionResult Confirmation(ConfirmationModel){
...
}

问题是他们传递的参数名称不是人类可读的。我想把它们映射到我更可读的模型。

't_numb' ====> 'TransactionNumber'

这可以自动完成吗?有一个属性可能吗?这里最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

创建模型绑定器:

using System.Web.Mvc;
using ModelBinder.Controllers;

public class ConfirmationModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var model = new ConfirmationModel();

        var transactionNumberParam = bindingContext.ValueProvider.GetValue("t_numb");

        if (transactionNumberParam != null)
            model.TransactionNumber = transactionNumberParam.AttemptedValue;

        return model;
    }
}

在Global.asax.cs中初始化它:

protected void Application_Start()
{
    ModelBinders.Binders.Add(typeof(ConfirmationModel), new ConfirmationModelBinder());
}

然后在你的行动方法

[HttpPost]
public ActionResult Confirmation(ConfirmationModel viewModel)

您应该会看到t_numb的值显示在viewmodel的TransactionNumber属性中。

答案 1 :(得分:0)

同意模型绑定器更好:虽然这是另一个想法

public ActionResult Create(FormCollection values)
{
    Recipe recipe = new Recipe();
    recipe.Name = values["Name"];      

    // ...

    return View();
}

并且很好地阅读了两篇文章:http://odetocode.com/blogs/scott/archive/2009/04/27/6-tips-for-asp-net-mvc-model-binding.aspx