标签: modelbinders

IModelBinder上的BindProperty和SetProperty有什么区别

我在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 modelbinders

11
推荐指数
1
解决办法
4877
查看次数

ASP.NET MVC - 带有URL附加参数的POST操作方法

使用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操作.

c# asp.net-mvc modelbinders actionmethod

10
推荐指数
1
解决办法
3万
查看次数

ASP.NET MVC 2 - 在IValueProvider上设置值

我正在尝试将我的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)

asp.net-mvc modelbinders asp.net-mvc-2

9
推荐指数
1
解决办法
3118
查看次数

Asp.NET MVC 2中的通用TimeSpan绑定

我有一个绑定到模型的输入表单.该模型具有TimeSpan属性,但只有当我输入时间为hh:mm或hh:mm:ss时,它才能正确获取值.我想要的是它捕获值,即使它被写为hhmm或hh.mm或hh.mm.ss或...我想要正确解析许多不同的格式.这可能吗?

谢谢!

.net timespan modelbinders asp.net-mvc-2

9
推荐指数
2
解决办法
2946
查看次数

ValueProvider不包含TryGetValue的定义

在我的应用程序中,我试图从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文件夹中.

c# asp.net-mvc datetime modelbinders

9
推荐指数
2
解决办法
6179
查看次数

自定义模型绑定,模型状态和数据注释

我有一些关于自定义模型绑定,模型状态和数据注释的问题.

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

9
推荐指数
1
解决办法
1万
查看次数

OnActionExecuting在开始行动之前添加到模型

我有以下内容:

 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)

c# modelbinders action-filter asp.net-mvc-3

9
推荐指数
1
解决办法
5268
查看次数

获取FormCollection输出自定义模型绑定器的controllerContext

我有一个很好的函数,它接受了我的FormCollection(从控制器提供).现在我想做一个模型绑定,让我的模型绑定器调用该函数,它需要FormCollection.出于某种原因,我可以找到它.我以为会是这样的 controllerContext.HttpContext.Request.Form

asp.net-mvc modelbinders

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

ASP.Net MVC ModelBindingContext类 - 如何填充其模型值?

我对于模型绑定器在ASP.Net MVC中的工作方式略有不解.

具体来说,BindModel()方法有一个ModelBindingContext参数,它保存模型名称和类型,但我不明白ModelBindingContext如何接收这些值.

必须从发布的表单值或查询字符串参数或其他数据源填充MVC模型.但是什么机制决定了传递给ModelBindingContext的模型类型,以及如何选择一种模型类型而不是另一种模型类型,甚至是(包括)包含各个发布值的简单列表?

在我看来,ModelBindingContext"知道"它所交付的模型的类型,我不确定它的来源或填充它所涉及的工作流程.

asp.net-mvc modelbinders custom-model-binder

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

ASP.NET MVC模型在编辑器模板中绑定IList

我试图绑定一个列表,该列表是较大的视图模型的一部分,而不依赖于自定义模型绑定器.当我使用编辑器模板来构建输入列表时,生成的名称的格式不正确,默认绑定器可以使用.

而不是物品[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)

asp.net-mvc modelbinders

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