标签: defaultmodelbinder

MVC3非顺序索引和DefaultModelBinder

MVC 3.0中的默认模型绑定器是否能够处理非顺序索引(对于简单和复杂模型类型)?我遇到的帖子表明应该这样做,但是在我的测试中它似乎没有.

给出后期值:

items[0].Id = 10
items[0].Name = "Some Item"
items[1].Id = 3
items[1].Name = "Some Item"
items[4].Id = 6
items[4].Name = "Some Item"
Run Code Online (Sandbox Code Playgroud)

和控制器方法:

public ActionResult(IList<MyItem> items) { ... }
Run Code Online (Sandbox Code Playgroud)

加载的唯一值是项0和1; 第4项被忽略了.

我已经看到了许多生成自定义索引的解决方案(模型绑定到列表),但是它们似乎都是针对MVC的早期版本,而且大多数都是有点"严厉"的IMO.

我错过了什么吗?

defaultmodelbinder modelbinders asp.net-mvc-3

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

当参数是Model时,ASP.NET MVC发布了文件模型绑定

有没有办法让发布的文件(<input type="file" />)参与ASP.NET MVC中的模型绑定,而无需在自定义模型绑定器中手动查看请求上下文,而无需创建仅将已发布文件作为输入的单独操作方法?

我原以为这会起作用:

class MyModel {
  public HttpPostedFileBase MyFile { get; set; }
  public int? OtherProperty { get; set; }
}

<form enctype="multipart/form-data">
  <input type="file" name="MyFile" />
  <input type="text" name="OtherProperty" />
</form>

public ActionResult Create(MyModel myModel) { ... } 
Run Code Online (Sandbox Code Playgroud)

但鉴于上述情况,MyFile甚至不是绑定上下文中值提供者值的一部分.(OtherProperty当然是.)但如果我这样做,它会起作用:

public ActionResult Create(HttpPostedFileBase postedFile, ...) { ... } 
Run Code Online (Sandbox Code Playgroud)

那么,当参数是模型时,为什么没有绑定发生,我怎样才能使它工作?我使用自定义模型绑定器没有问题,但是如何在不看的情况下在自定义模型绑定器中执行此操作Request.Files["MyFile"]

为了保持一致性,清晰度和可测试性,我希望我的代码能够自动绑定模型上的所有属性,包括绑定到已发布文件的属性,而无需手动检查请求上下文.我目前正在使用Scott Hanselman撰写的方法测试模型绑定.

或者我是以错误的方式解决这个问题?你怎么解决这个问题?或者,由于Request.Form和Request.Files之间的分离历史,这是不可能的设计?

asp.net-mvc defaultmodelbinder modelbinders httppostedfilebase

24
推荐指数
3
解决办法
2万
查看次数

如何使用jQuery将int列表发送到ASP.net MVC Default Model Binder

当我用jQuery发送一个int列表时,如下所示:

$.ajax('@Url.Action("Execute")', {
    type: 'POST',
    data: {
        pkList: [1,2,3]
    }
});
Run Code Online (Sandbox Code Playgroud)

然后jQuery将转换pkList对象并通过post发送它,如下所示:

pkList[]:1
pkList[]:2
pkList[]:3
Run Code Online (Sandbox Code Playgroud)

如果服务器是PHP但是我使用Asp.NET MVC3并尝试使用默认模型绑定器获取这些值,这将是正常的:

public ActionResult Execute(ICollection<int> pkList)
Run Code Online (Sandbox Code Playgroud)

但是pkList总是为null,似乎默认的模型绑定器不能绑定它.

我该如何正确解决这个问题?


增加 解决方案

我使用Darin Dimitrov的解决方案traditional在jQuery中设置选项:

$.ajax('@Url.Action("Execute")', {
    type: 'POST',
    traditional: true,
    data: {
        pkList: [1,2,3]
    }
});
Run Code Online (Sandbox Code Playgroud)

现在jQuery不再添加[]参数了,它们是这样发送的:

pkList:1
pkList:2
pkList:3
Run Code Online (Sandbox Code Playgroud)

MVC默认模型绑定器正确获取值.

希望这有助于某人.

jquery defaultmodelbinder asp.net-mvc-3

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

Asp.Net MVC中带有千位分隔符的十进制值

我有一个自定义模型类,其中包含一个十进制成员和一个接受此类的条目的视图.一切都运行良好,直到我添加javascripts来格式化输入控件内的数字.当焦点模糊时,格式代码格式化输入的数字与千位分隔符','.

问题是我的模态类中的十进制值没有与千位分隔符很好地绑定/解析.当我用"1,000.00"测试它时,ModelState.IsValid返回false,但是对于"100.00"没有任何更改它是有效的.

如果您有任何解决方案,请与我分享?

提前致谢.

样本类

public class Employee
{
    public string Name { get; set; }
    public decimal Salary { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

样本控制器

public class EmployeeController : Controller
{
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult New()
    {
        return View();
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult New(Employee e)
    {
        if (ModelState.IsValid) // <-- It is retruning false for values with ','
        {
            //Subsequence codes if entry is valid.
            //
        }
        return View(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

示例视图

<% using (Html.BeginForm())
   { %>

    Name:   <%= Html.TextBox("Name")%><br /> …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc decimal defaultmodelbinder

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

带有嵌套列表的ASP.NET MVC DefaultModelBinder

我有一个表格,表格代表员工的时间表.顶部的天数,项目的侧面,每天/项目交叉点包含常规小时和加班的两个值.

页面模型的(简化)类定义是:

public class TimesheetFormModel {
    public List<Project> Projects;
    // other things...
}
public class Project {
    public string Name;
    public List<WorkUnit> WorkUnits;
}
public class WorkUnit {
    public DateTime Date;
    public decimal RegularHours;
    public decimal OvertimeHours;
}
Run Code Online (Sandbox Code Playgroud)

页面上的表单元素如下命名,试图让DefaultModelBinder获取它们.

model.Projects[0].Name // "New Project"
model.Projects[0].WorkUnits[0].Date // "5/23/2009 12:00:00 AM"
model.Projects[0].WorkUnits[0].RegularHours // 0
model.Projects[0].WorkUnits[0].OvertimeHours // 0

model.Projects[0].WorkUnits[1].Date // "5/24/2009 12:00:00 AM"
model.Projects[0].WorkUnits[1].RegularHours // 0
model.Projects[0].WorkUnits[1].OvertimeHours // 0

model.Projects[0].WorkUnits[2].Date // "5/25/2009 12:00:00 AM"
model.Projects[0].WorkUnits[2].RegularHours // 0
model.Projects[0].WorkUnits[2].OvertimeHours // 0

// etc.
Run Code Online (Sandbox Code Playgroud)

但是,提交视图时,model …

asp.net asp.net-mvc defaultmodelbinder

13
推荐指数
1
解决办法
3771
查看次数

默认模型Binder不绑定IEnumerable中的Nullable类型

我有一个控制器动作,其定义如下 -

public ActionResult ChangeModel( IEnumerable<MyModel> info, long? destinationId)
Run Code Online (Sandbox Code Playgroud)

而型号:

public class MyModel
{
    public string Name; //Gets populated by default binder
    public long? SourceId; //remains null though the value is set when invoked
}
Run Code Online (Sandbox Code Playgroud)

"名称"属性,都会在控制器动作人口不过的sourceID财产保持为空.该目标-ID这是一个很长?参数也会被填充.

在单步执行MVC(版本2)源代码时,这是DefaultModelBinder抛出的异常.

从类型'System.Int32'到类型'System.Nullable`1 [[System.Int64,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]的参数转换失败,因为没有类型转换器可以转换这些类型.

如果模型更改为long而不是long?,则默认模型绑定器会设置该值.

public class MyModel
{
    public string Name {get;set;}; //Gets populated by default binder
    public long SourceId {get;set;}; //No longer long?, so value gets set
}
Run Code Online (Sandbox Code Playgroud)

这是一个已知的问题?由于MVC源代码已经过优化,我无法单步执行大部分代码. …

c# asp.net-mvc defaultmodelbinder model-binding asp.net-mvc-2

13
推荐指数
1
解决办法
3066
查看次数

具有复杂类型嵌套对象的bind属性include和exclude属性

好的,这很奇怪.我不能用BindAttributeIncludeExclude性质与ASP.NET MVC复杂类型嵌套对象.

这是我做的:

这是我的模特:

public class FooViewModel {

    public Enquiry Enquiry { get; set; }
}

public class Enquiry {

    public int EnquiryId { get; set; }
    public string Latitude { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

HTTP Post动作:

[ActionName("Foo"), HttpPost]
public ActionResult Foo_post(
    [Bind(Include = "Enquiry.EnquiryId")]
    FooViewModel foo) {

    return View(foo);
}
Run Code Online (Sandbox Code Playgroud)

视图:

@using (Html.BeginForm()) {

    @Html.TextBoxFor(m => m.Enquiry.EnquiryId)
    @Html.TextBoxFor(m => m.Enquiry.Latitude)

    <input type="submit" value="push" />
}
Run Code Online (Sandbox Code Playgroud)

根本不起作用.如果我按照此处的说明定义BindAttributefor Enquiry类,我可以只做这项工作:

如何在复杂的嵌套对象上使用[Bind(Include ="")]属性?

asp.net-mvc defaultmodelbinder model-binding asp.net-mvc-3

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

ASP.NET MVC默认的binder:太长的int,空验证错误信息

我有以下模型类(为简单起见而剥离):

public class Info
{
    public int IntData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是我使用此模型的Razor表单:

@model Info
@Html.ValidationSummary()
@using (Html.BeginForm())
{
    @Html.TextBoxFor(x => x.IntData)
    <input type="submit" />
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我在文本框中输入非数字数据,我会收到一条正确的验证消息,即:"值'qqqqq'对字段'IntData'无效".

但是如果我输入一个很长的数字序列(如345234775637544),我会收到一个EMPTY验证摘要.

在我的控制器代码中,我看到的ModelState.IsValidfalse预期的,ModelState["IntData"].Errors[0]如下所示:

{System.Web.Mvc.ModelError}
ErrorMessage: ""
Exception: {"The parameter conversion from type 'System.String' to type 'System.Int32' failed. See the inner exception for more information."}

(exception itself) [System.InvalidOperationException]: {"The parameter conversion from type 'System.String' to type 'System.Int32' failed. See the inner exception for more information."}
InnerException: {"345234775637544 is …
Run Code Online (Sandbox Code Playgroud)

c# validation defaultmodelbinder model-binding asp.net-mvc-3

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

ASP.NET MVC 3对嵌套对象的验证无法按预期工作 - 验证子对象两次而不是父对象

我试图让ASP.NET MVC 3从复杂的嵌套对象生成表单.我发现有一个验证行为是意外的,我不确定它是否是DefaultModelBinder中的错误.

如果我有两个对象,让我们调用"父"一个"OuterObject",它有一个"InnerObject"类型的属性(子):

    public class OuterObject : IValidatableObject
{
    [Required]
    public string OuterObjectName { get; set; }

    public InnerObject FirstInnerObject { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (!string.IsNullOrWhiteSpace(OuterObjectName) && string.Equals(OuterObjectName, "test", StringComparison.CurrentCultureIgnoreCase))
        {
            yield return new ValidationResult("OuterObjectName must not be 'test'", new[] { "OuterObjectName" });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是InnerObject:

    public class InnerObject : IValidatableObject
{
    [Required]
    public string InnerObjectName { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (!string.IsNullOrWhiteSpace(InnerObjectName) && string.Equals(InnerObjectName, "test", StringComparison.CurrentCultureIgnoreCase))
        {
            yield …
Run Code Online (Sandbox Code Playgroud)

validation asp.net-mvc defaultmodelbinder asp.net-mvc-3

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

bindingContext.ModelName 为空?

所以我试图应用Darin Dimitrov 的回答,但在我的实现中 bindingContext.ModelName 等于“”。

这是我的视图模型:

public class UrunViewModel
{
    public Urun Urun { get; set; }
    public Type UrunType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是发布模型类型的视图部分:

@model UrunViewModel

@{
    ViewBag.Title = "Tablo Ekle";

    var types = new List<Tuple<string, Type>>();
    types.Add(new Tuple<string, Type>("Tuval Bask?", typeof(TuvalBaski)));
    types.Add(new Tuple<string, Type>("Ya?l? Boya", typeof(YagliBoya)));
}

<h2>Tablo Ekle</h2>

    @using (Html.BeginForm("UrunEkle", "Yonetici")) {
        @Html.ValidationSummary(true)
        <fieldset>
            <legend>Tablo</legend>

            @Html.DropDownListFor(m => m.UrunType, new SelectList(types, "Item2", "Item1" ))
Run Code Online (Sandbox Code Playgroud)

这是我的自定义模型绑定器:

public class UrunBinder : DefaultModelBinder
{
    protected override object CreateModel(ControllerContext …
Run Code Online (Sandbox Code Playgroud)

c# defaultmodelbinder asp.net-mvc-3

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