我需要实现一种功能,允许用户以任何形式输入价格,即允许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
我正在尝试编写一个自定义模型绑定器,但我很难设法如何绑定复杂的复合对象.
这是我想要绑定的类:
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) 我有一系列视图,每个视图都有自己的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)吗?
谢谢大家
我有我认为是一种有点正常的情况,我需要将表单帖子绑定到"订单"模型.该模型具有以下几个级别的信息:
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.
我需要将我的自定义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实现,但是如何将其连接起来还不清楚.(在这篇文章中)
有人有例子吗?
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
我有一个这样的动作方法如下.
[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) 我试图让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) 我的表单中有一个项目列表,其名称如下...
<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 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表单的上下文中使用的方法.目标是从域对象和背面实现简单和容易的控制,最好考虑验证注释.如果不可能,有人可能会指出我的开源解决方案来满足这种需求.我真的不想重写这样的代码.
提前致谢.
modelbinders ×10
asp.net-mvc ×8
c# ×2
arrays ×1
asp.net ×1
imodelbinder ×1
mvvm ×1
nested ×1
webforms ×1