我在Mvc应用程序中创建自定义模型绑定器,我想将字符串解析为枚举值并将其分配给模型属性.我已经让它覆盖了该BindProperty方法,但我也注意到有一种SetProperty方法.
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor)
{
switch (propertyDescriptor.Name)
{
case "EnumProperty":
BindEnumProperty(controllerContext, bindingContext);
break;
}
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}
private static void BindEnumProperty(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var formValue = controllerContext.HttpContext.Request.Form["formValue"];
if (String.IsNullOrEmpty(formValue))
{
throw new ArgumentException();
}
var model = (MyModel)bindingContext.Model;
model.EnumProperty = (EnumType)Enum.Parse(typeof(EnumType), formValue);
}
Run Code Online (Sandbox Code Playgroud)
我不确定两者之间的区别是什么,以及我是否以推荐的方式这样做.
使用ASP.net MVC是否可以将表单POST到控制器操作,该操作包括不在表单中的参数,但是来自URL?
例如
GroupController中的Action方法:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(int idOne, int idTwo, Model model)
{ ... }
Run Code Online (Sandbox Code Playgroud)
路线:
"{controller}/{action}/{idOne}/{idTwo}"
Run Code Online (Sandbox Code Playgroud)
发布网址:
/Employee/Show/1/42
Run Code Online (Sandbox Code Playgroud)
在此示例中,表单将发布到不同的控制器,模型具有正确的值,但其他参数的默认值为0.
我期望的行为是ModelBinder会看到我有两个匹配给定路由的参数,并以与GET操作相同的方式将当前值1和42分配给参数.
这种行为不受支持,或者我错过了什么?
编辑:要清楚,Show控制器视图上的Employee表单包含一个发布到不同控制器的表单.我们可以称之为Group.
表单操作URL如下所示
/Groups/Create/0/0
Run Code Online (Sandbox Code Playgroud)
表格声明如下
Html.BeginForm("Create", "Groups")
Run Code Online (Sandbox Code Playgroud)
尝试了许多不同的重载后,Html.BeginForm我发现仅当表单操作URL与浏览器地址栏中的当前URL匹配时才会映射参数.
因此,如果我导航到URL,/Groups/Create/1/42我将有一个新表格.如果我然后提交表单,则URL路由值将传递给POST操作.
我正在尝试将我的MVC 1项目升级到MVC 2 RC.我们目前有一个自定义模型绑定器,它将项目添加到ValueProvider(这在字典时起作用).然后我们将其传递给默认的模型绑定器.但是,IValueProvider没有add方法,因此该算法不再有效.有谁知道在MVC 2中为ValueProvider添加值的方法?
foreach(string valKey in controllerContext.RequestContext.HttpContext.Request.Form.AllKeys.Where(x => x.StartsWith(valuesToChangePrefix)))
{
string valName = valKey.Substring(valuesToChangePrefix.Length);
string myVal = ManipulateValue(bindingContext.ValueProvider.GetValue(valKey).AttemptedValue);
// This is where I need to add to my value Provider (As you can see I used to just assign a ValueProviderResult
//bindingContext.ValueProvider = new ValueProviderResult(myVal.Split(','), myVal, bindingContext.ValueProvider.GetValue(valKey).Culture);
}
Run Code Online (Sandbox Code Playgroud) 我有一个绑定到模型的输入表单.该模型具有TimeSpan属性,但只有当我输入时间为hh:mm或hh:mm:ss时,它才能正确获取值.我想要的是它捕获值,即使它被写为hhmm或hh.mm或hh.mm.ss或...我想要正确解析许多不同的格式.这可能吗?
谢谢!
在我的应用程序中,我试图从DateTime字段拆分日期和时间,以便我可以在日期上放置一个jQuery日期选择器.我找到了Hanselman用于拆分DateTime的代码,但是我遇到了编译错误bindingContext.ValueProvider.TryGetValue(modelName, out valueResult);.我得到的错误是:
错误3'System.Web.Mvc.IValueProvider'不包含'TryGetValue'的定义,并且没有可以找到接受类型'System.Web.Mvc.IValueProvider'的第一个参数的扩展方法'TryGetValue'(你错过了吗? using指令或程序集引用?)C:\ Documents and Settings\xxx\My Documents\Visual Studio 2008\Projects\MyProject\Project\Helpers\DateAndTimeModelBinder.cs 83 42项目
我错过了什么?我创建了一个新类,并将他的代码放在我项目的Helpers文件夹中.
我有一些关于自定义模型绑定,模型状态和数据注释的问题.
1)如果我的模型上有数据注释,那么在自定义模型绑定器中进行验证是否是多余的,因为这就是我认为数据注释的重点.
2)为什么我的控制器将模型状态视为有效,即使它不是,主要是我使Name属性为null或太短.
3)将自定义模型绑定器视为构造方法是否可以,因为这是他们提醒我的.
首先是我的模型.
public class Projects
{
[Key]
[Required]
public Guid ProjectGuid { get; set; }
[Required]
public string AccountName { get; set; }
[Required(ErrorMessage = "Project name required")]
[StringLength(128, ErrorMessage = "Project name cannot exceed 128 characters")]
[MinLength(3, ErrorMessage = "Project name must be at least 3 characters")]
public string Name { get; set; }
[Required]
public long TotalTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我使用自定义模型绑定器来绑定模型的某些属性.请不要介意它只是试图让它运行然后重构它是快速和肮脏的.
public class ProjectModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) …Run Code Online (Sandbox Code Playgroud) validation asp.net-mvc modelbinders modelstate data-annotations
我有以下内容:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
var model = filterContext.Controller.ViewData.Model as BaseViewModel;
if (model == null)
{
model = new BaseViewModel();
filterContext.Controller.ViewData.Model = model;
}
model.User = (UserPrincipal)filterContext.HttpContext.User;
model.Scheme = GetScheme();
}
Run Code Online (Sandbox Code Playgroud)
现在逐步完成我可以看到模型上的用户和方案正在填充.
当我开始行动但是他们都是空的?
我在这做错了什么?
除此之外,这是添加到模型的正确方法吗?
这是控制器代码:
[InjectStandardReportInputModel]
public ActionResult Header(BaseViewModel model)
{
//by this point model.Scheme is null!!
}
Run Code Online (Sandbox Code Playgroud) 我有一个很好的函数,它接受了我的FormCollection(从控制器提供).现在我想做一个模型绑定,让我的模型绑定器调用该函数,它需要FormCollection.出于某种原因,我可以找到它.我以为会是这样的
controllerContext.HttpContext.Request.Form
我对于模型绑定器在ASP.Net MVC中的工作方式略有不解.
具体来说,BindModel()方法有一个ModelBindingContext参数,它保存模型名称和类型,但我不明白ModelBindingContext如何接收这些值.
必须从发布的表单值或查询字符串参数或其他数据源填充MVC模型.但是什么机制决定了传递给ModelBindingContext的模型类型,以及如何选择一种模型类型而不是另一种模型类型,甚至是(包括)包含各个发布值的简单列表?
在我看来,ModelBindingContext"知道"它所交付的模型的类型,我不确定它的来源或填充它所涉及的工作流程.
我试图绑定一个列表,该列表是较大的视图模型的一部分,而不依赖于自定义模型绑定器.当我使用编辑器模板来构建输入列表时,生成的名称的格式不正确,默认绑定器可以使用.
而不是物品[3].就像我期望它是物品.[3] .Id.如果我在没有编辑器模板的情况下构建列表,它将按预期工作.
我做了一些明显错误的事情,或者这只是Html.Hidden和Html.TextBox的怪癖?
public class ItemWrapper
{
[UIHint("ItemList")]
public IList<Item> Items { get; set; }
}
public class Item
{
public Guid Id { get; set; }
public string Name { get; set; }
public int Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
的Index.aspx
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Index</h2>
<% using(Html.BeginForm())
{%>
<%:Html.EditorFor(m => m.Items) %>
<%}%>
</asp:Content>
Run Code Online (Sandbox Code Playgroud)
ItemList.ascx
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<Mvc2Test.Models.Item>>" %>
<h4>Asset Class Allocation</h4>
<% if(Model.Count > 0) { %>
<table>
<tbody>
<% for(int i = 0; …Run Code Online (Sandbox Code Playgroud) modelbinders ×10
asp.net-mvc ×8
c# ×3
.net ×1
actionmethod ×1
datetime ×1
modelstate ×1
timespan ×1
validation ×1