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.
我错过了什么吗?
有没有办法让发布的文件(<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
当我用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默认模型绑定器正确获取值.
希望这有助于某人.
我有一个自定义模型类,其中包含一个十进制成员和一个接受此类的条目的视图.一切都运行良好,直到我添加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) 我有一个表格,表格代表员工的时间表.顶部的天数,项目的侧面,每天/项目交叉点包含常规小时和加班的两个值.
页面模型的(简化)类定义是:
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 …
我有一个控制器动作,其定义如下 -
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
好的,这很奇怪.我不能用BindAttribute
的Include
和Exclude
性质与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)
根本不起作用.如果我按照此处的说明定义BindAttribute
for Enquiry
类,我可以只做这项工作:
我有以下模型类(为简单起见而剥离):
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.IsValid
是false
预期的,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
我试图让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) 所以我试图应用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)