标签: modelbinders

ASP.NET MVC - 能够处理数组的自定义模型绑定器

我需要实现一种功能,允许用户以任何形式输入价格,即允许10美元,10美元,10美元......作为输入.

我想通过为Price类实现自定义模型绑定器来解决这个问题.

 class Price { decimal Value; int ID; } 
Run Code Online (Sandbox Code Playgroud)

表单包含一个数组或价格作为键

keys:
"Prices[0].Value"
"Prices[0].ID"
"Prices[1].Value"
"Prices[1].ID"
...
Run Code Online (Sandbox Code Playgroud)

ViewModel包含一个Price属性:

public List<Price> Prices { get; set; }
Run Code Online (Sandbox Code Playgroud)

只要用户在Value输入中输入十进制可转换字符串,默认模型绑定器就可以正常工作.我想允许输入"100美元".

我的ModelBinder for Price类型到目前为止:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    Price res = new Price();
    var form = controllerContext.HttpContext.Request.Form;
    string valueInput = ["Prices[0].Value"]; //how to determine which index I am processing?
    res.Value = ParseInput(valueInput) 

    return res;
}
Run Code Online (Sandbox Code Playgroud)

如何实现正确处理数组的自定义模型Binder?

arrays asp.net-mvc imodelbinder modelbinders custom-model-binder

8
推荐指数
1
解决办法
7327
查看次数

复杂复合对象的自定义模型粘合剂帮助

我正在尝试编写一个自定义模型绑定器,但我很难设法如何绑定复杂的复合对象.

这是我想要绑定的类:

public class Fund
{
        public int Id { get; set; }
        public string Name { get; set; }
        public List<FundAllocation> FundAllocations { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这就是我尝试编写自定义绑定器的方式:

public class FundModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        throw new NotImplementedException();
    }

    public object GetValue(ControllerContext controllerContext, string modelName, Type modelType, ModelStateDictionary modelState)
    {
        var fund = new Fund();

        fund.Id = int.Parse(controllerContext.HttpContext.Request.Form["Id"]);
        fund.Name = controllerContext.HttpContext.Request.Form["Name"];

        //i don't know how to bind to the list property :(
        fund.FundItems[0].Catalogue.Id …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc modelbinders

7
推荐指数
2
解决办法
6564
查看次数

ASP.NET MVC框架中的MVVM和ModelBinders

我有一系列视图,每个视图都有自己的ViewModel类,其中包含显示自己所需的所有内容,例如:

public class CreateResourceViewModel
{
     public Project Parent { get; set; }
     public SelectList Categories { get; set; }
     public Resource Resource { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想使用的post动作方法如下所示:

[AcceptVerbs (HttpVerbs.Post)]
public ActionResult Create (Resource resource)
{
   // Update code...
}
Run Code Online (Sandbox Code Playgroud)

请注意,我唯一感兴趣的对象是CreateResourceViewModel的Resource属性,而不是CreateResourceViewModel本身.其他所有东西对于用户来说都是肉汁,他们正在更新的是资源类......

这可能在MVC框架内(即使它是v2 CTP)吗?

谢谢大家

asp.net-mvc mvvm modelbinders

7
推荐指数
1
解决办法
2419
查看次数

DefaultModelBinder嵌套级别+其他绑定器的问题

我有我认为是一种有点正常的情况,我需要将表单帖子绑定到"订单"模型.该模型具有以下几个级别的信息:

Order.Billing.FirstName
Order.Billing.Address.City
Order.Billing.Address.Country
Run Code Online (Sandbox Code Playgroud)

使用DefaultModelBinder,如果我将表单发布到将此Order模型作为参数的操作,则以下字段为JustWork(TM):

<%=Html.TextBox("Billing.FirstName")%>
<%=Html.TextBox("Billing.Address.City")%>
Run Code Online (Sandbox Code Playgroud)

此字段不会:

<%=Html.TextBox("Billing.Address.Country")%>
Run Code Online (Sandbox Code Playgroud)

我的皱纹是乡村财产.在我们的例子中,Address.Country返回一个Country类实例(ISO2/3/Name/Code逻辑).它不是一个字符串.毫不奇怪它默认不起作用.

我的第一个想法是创建一个CountryModelBinder(继承DefaultModelBinder)和ModelBinders.Binders.将它添加到Country的类型.当我这样做时,CountryModelBinder永远不会在上面的场景中被调用.

我的第二个想法是创建一个AddressModelBinder(继承DefaultModelBinder)并将其绑定到我们的Address类型.虽然它被调用,但SetProperty对"Country"的调用具有空值,即使表单已发布名为"Billing.Address.Country"的字段.

一些修修补补之后,看来当模型的顶层类动作的人,而其他所有的粘合剂都要求孩子自己的属性BindPropery /的SetProperty模型绑定行为只要求CreateModel.

换句话说,如果我为Order,OrderAddress(Billing),Address和Country创建模型绑定器.对于接受订单的操作,仅调用OrderModelBinder.CreateModel.ORderAddress和Address.BindProperty/SetProperty被调用用于某些事情,有时SetProperty值参数是空的,当它明确地张贴在与其他字段属性映射匹配的名称中时.

只需向OrderModelBinder添加代码就可以将Billing.Address.Country拉出Request.Form.但是我有多个使用Address的模型,并且所有这些模型看起来都很糟糕.

我在这里错过了什么?有没有办法在这种情况下实际调用CountryModelBinder?我认为当Billing.Address.Country映射到Address绑定器的Country属性时,应该调用CountryModelBinder.

asp.net-mvc nested defaultmodelbinder modelbinders

7
推荐指数
1
解决办法
905
查看次数

MVC 3中ModelBinder构造函数注入的示例IModelBinderProvider实现

我需要将我的自定义ModelBinder连接到MVC 3中的DI容器,但我无法使其工作.

所以.这就是我所拥有的:一个带有构造函数注入服务的ModelBinder.

public class ProductModelBinder : IModelBinder{
  public ProductModelBinder(IProductService productService){/*sets field*/}
  // the rest don't matter. It works.
}
Run Code Online (Sandbox Code Playgroud)

如果我这样添加它我的活页夹工作正常:

ModelBinders.Binders.Add(typeof(Product),
     new ProductModelBinder(IoC.Resolve<IProductService>()));
Run Code Online (Sandbox Code Playgroud)

但这是做旧的方式,我不希望如此.

我需要的是如何将模型绑定器挂钩到我注册的IDependencyResolver.

根据Brad Wilson的说法,秘密是使用IModelBinderProvider实现,但是如何将其连接起来还不清楚.(在这篇文章中)

有人有例子吗?

asp.net-mvc modelbinders asp.net-mvc-3

7
推荐指数
2
解决办法
6001
查看次数

DataContract模型绑定到ASP.NET MVC操作方法参数中的JSON

MVC3开箱即用JsonValueProviderFactory(),它非常方便将传入的JSON绑定到模型.不幸的是,我无法弄清楚如何设置名称与传入JSON不同的模型合同.例如:

[DataContract(Name = "session")]
public class FacebookSession
{
    [DataMember(Name = "access_token")]
    public string AccessToken { get; set; }

    [DataMember(Name = "expires")]
    public int? Expires { get; set; }

    [DataMember(Name = "secret")]
    public string Secret { get; set; }

    [DataMember(Name = "session_key")]
    public string Sessionkey { get; set; }

    [DataMember(Name = "sig")]
    public string Signature { get; set; }

    [DataMember(Name = "uid")]
    public string UserId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

传入表示facebook会话的json对象时,属性secret和expires正确绑定,但其余部分没有,因为属性名称与json键名称不同.我希望datacontract序列化程序可以尝试绑定到属性中提供的名称,但似乎并非如此.有没有人有任何解决方法的建议?

编辑

我将如何使用此模型的示例:

    public ActionResult Log(int? custId, FacebookSession response)
    {       
          ViewBag.Id …
Run Code Online (Sandbox Code Playgroud)

c# model-binding datacontractserializer modelbinders asp.net-mvc-3

7
推荐指数
1
解决办法
6844
查看次数

DefaultModelBinder和继承对象的集合

我有一个这样的动作方法如下.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Form newForm)
{
     ...
}
Run Code Online (Sandbox Code Playgroud)

我有一个包含以下类的模型,我想从ajax JSON数据加载数据.

public class Form
{
    public string title { get; set; }

    public List<FormElement> Controls { get; set; }

}

public class FormElement
{
    public string ControlType { get; set; }

    public string FieldSize { get; set; }
}

public class TextBox : FormElement
{
    public string DefaultValue { get; set; }
}

public class Combo : FormElement
{
    public string SelectedValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是JSON数据.

{ "title": …
Run Code Online (Sandbox Code Playgroud)

c# model-view-controller asp.net-mvc modelbinders

7
推荐指数
1
解决办法
440
查看次数

带接口的ASP.NET MVC UpdateModel

我试图让UpdateModel填充一个在编译时设置为只有接口的模型.例如,我有:

// View Model
public class AccountViewModel {
  public string Email { get; set; }
  public IProfile Profile { get; set; }
}

// Interface
public interface IProfile {
  // Empty
}

// Actual profile instance used
public class StandardProfile : IProfile {
  public string FavoriteFood { get; set; }
  public string FavoriteMusic { get; set; }
}

// Controller action
public ActionResult AddAccount(AccountViewModel viewModel) {
  // viewModel is populated already
  UpdateModel(viewModel.Profile, "Profile"); // This isn't working.
}

// Form …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc defaultmodelbinder modelbinders

6
推荐指数
1
解决办法
2314
查看次数

Asp.Net MVC 2 - 在模型绑定器中迭代表单值

我的表单中有一个项目列表,其名称如下...

<input type="text" id="ListItem1" name="ListItem1">
<input type="text" id="ListItem2" name="ListItem2">
<input type="text" id="ListItem3" name="ListItem3">
Run Code Online (Sandbox Code Playgroud)

我想创建一个自定义模型绑定器,使用此结构将这些绑定器转换为模型...

public class MyModel
{
  public IEnumerable<MyModelItem> Items {get; set;}
}

public class MyModelItem
{
  public int Id { get; set; }
  public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

因此,每个ListItem应转换为MyModelItem,其id等于输入id末尾的数字,并将值设置为输入字段上的值.

在ASP.Net MVC 1.0中,我可以遍历bindingContext.ValueProvider.Keys集合并检查key.StartsWith("ListItem")以此格式查找所有输入项.

ASP.Net MVC 2中的新IValueProvider接口没有密钥集合,我无法迭代该接口. 如何在ASP.Net MVC 2中访问这些我只知道设计时前缀的值?

asp.net-mvc modelbinders

6
推荐指数
1
解决办法
2089
查看次数

ASP.NET webforms中的模型Binder

多年来我做了ASP.NET Web表单开发我被一个专有库所破坏,这让我可以做以下事情:

    UpdateToObject(ControlsCollection, obj)
    UpdateFromObject(ControlsCollection, obj)
Run Code Online (Sandbox Code Playgroud)

概念上,代码做了一些与MVC Model Binder非常相似的东西,即将表单的发布值作为输入,它将填充自定义对象.基本上它使开发人员免于做猴子代码,如

employee.Name = txtName.Text;
employee.DOB = DateTime.Parse(txtDOB.Text);
Run Code Online (Sandbox Code Playgroud)

等等..

现在,这个专有的库在我参与的新项目中不可用,它是一个Web表单项目.所以我想知道是否有一种System.Web.Mvc.DefaultModelBinder在Web表单的上下文中使用的方法.目标是从域对象和背面实现简单和容易的控制,最好考虑验证注释.如果不可能,有人可能会指出我的开源解决方案来满足这种需求.我真的不想重写这样的代码.

提前致谢.

asp.net webforms defaultmodelbinder modelbinders

6
推荐指数
1
解决办法
1755
查看次数