标签: model-binding

asp.net mvc Beta1中的ModelBinding

我将我的Web应用程序从预览3转换为beta1,现在我正在尝试使用框架的新功能.其中之一是ModelBinding.

对于这种特殊情况,我创建了一个类(现在)只是一堆简单类型属性的容器.如果我创建一个包含大量文本框的表单,我希望框架用这些字段填充SearchBag实例.

  • 我从哪里开始?这种行为是开箱即用还是我实现了SearchBagBinder?我快速浏览了一下IModelBinder,但是我无法完全理解它,并且DefaultModelBinder源代码并没有让我更聪明.
  • 这个ModelBindingContext是什么?
  • 如何访问我的表单字段?
  • 如果值不是由表单传递,而是直接输入URL,该怎么办?
  • 我在哪里可以找到关于此的最新信息(大多数博客已过时)?我以为我曾经读过菲尔的一篇文章,但我似乎无法再找到它了.

任何帮助表示赞赏.

asp.net-mvc model-binding

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

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
查看次数

MVC3如何在ViewModel中将多个复选框绑定到1个属性

我需要显示一个复选框列表,可以检查多个复选框.

当用户点击提交时,这些复选框的值需要进入ViewModel中的属性...这是我到目前为止所得到的...

public class RegisterModel
{
    public List<string> Roles { get; set; }
    public List<RoleModel> SelectedRoles { get; set; }    
}
public class RoleModel
{
    public string RoleName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在视图中我试图这样做......

@foreach (var role in Model.Roles)
{
    @Html.CheckBoxFor(m => m.SelectedRoles, role.RoleName)@role.RoleName
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

CS0029: Cannot implicitly convert type 'System.Collections.Generic.List<string>' to 'bool'
Run Code Online (Sandbox Code Playgroud)

有人能告诉我我做错了什么吗?

checkbox asp.net-mvc model-binding viewmodel asp.net-mvc-3

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

Asp.Net MVC 3 JSON模型绑定无法正常工作

我正在使用MVC3,我知道MVC3支持将JSON文字绑定到Action参数.但我不能成功;

我有一个班级名称Tag

public class Tag
{
    public int tagId { get; set; }
    public string tagName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器上的Action,名为Tag

    [HttpPost]
    public ActionResult Tag(Tag tag)
    {
        // Here will be codes...
        return Json(new { success = 0 });
    }
Run Code Online (Sandbox Code Playgroud)

将js对象作为JSON发送到我的操作的Javascript代码

    var tag ={tagId:5,tagName:"hello"};
    $.ajax({
           url: "/image/tag",
           type: "POST",
           data: $.toJSON(tag),
           success: function (r) {
               if (r.success == 1) {
                   window.location = r.redirect;
               }
           }
Run Code Online (Sandbox Code Playgroud)

发布我在Firebug Net选项卡中看到的数据

{"tagId":5,"tagName":"hello"}
Run Code Online (Sandbox Code Playgroud)

Tag Action中的参数名称标记不为null,但tagId的值为O,tagName的值为null.这里有什么问题?

json model-binding asp.net-mvc-3

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

如何将ASP.Net MVC路径段中的1或0映射到布尔操作方法输入参数

我们有一些PHP和Javascript应用程序调用一些ASP.NET MVC端点.假设我们有这个端点:

public ActionResult DoSomething(bool flag)
{

}
Run Code Online (Sandbox Code Playgroud)

我希望它匹配flag的值,无论我传入1或0的整数,还是传入一个"true"或"false"的字符串.我需要实现框架的哪个部分才能与之匹配?

asp.net-mvc model-binding value-provider asp.net-mvc-3 asp.net-mvc-4

7
推荐指数
2
解决办法
2800
查看次数

ASP.NET MVC5:想要使用模型绑定更新Collection中的多个项目

所以我有一个User对象集合,它应该是可批量编辑的(同时编辑许多用户).我正在使用Entity Framework将用户输入保存到数据库.

控制器方法从表单获取的集合为null.为什么?另外,BindAttribute是否可以与我的代码中的集合一起使用?

视图:

@model IEnumerable<Domain.User>
@using (Html.BeginForm("UpdateUsers", "Users"))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    foreach (var item in Model)
    {
        @Html.HiddenFor(modelItem => item.Id)
        @Html.EditorFor(modelItem => item.FirstName)
        @Html.ValidationMessageFor(model => item.FirstName)
        @Html.EditorFor(modelItem => item.LastName)
        @Html.ValidationMessageFor(model => item.LastName)
        @Html.EditorFor(modelItem => item.Birth)
        @Html.ValidationMessageFor(model => item.Birth)
    }

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

控制器:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult UpdateUsers([Bind(Include = "Id,FirstName,LastName,Birth")] IEnumerable<User> users)
{
    if (ModelState.IsValid)
    {
        foreach (User u in users)
        {
            db.Entry(u).State = EntityState.Modified;
        }
        db.SaveChanges();
    }

    return RedirectToAction("EditUsers");
}
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc entity-framework model-binding asp.net-mvc-5

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

单元测试方法参数的BindAttribute

我期待编写单元测试来验证我的控制器,同时确保正确设置绑定属性.使用以下方法结构,如何确保仅从单元测试传递有效字段?

public ActionResult AddItem([Bind(Include = "ID, Name, Foo, Bar")] ItemViewModel itemData)
{
    if (ModelState.IsValid)
    {
        // Save and redirect
    }

    // Set Error Messages
    // Rebuild object drop downs, etc.
    itemData.AllowedFooValues = new List<Foo>();
    return View(itemData);
}
Run Code Online (Sandbox Code Playgroud)

更广泛的解释:我们的许多模型都有允许值的列表,我们不希望来回发送,所以我们在(ModelState.IsValid == false)时重建它们.为了确保这些工作,我们希望放置单元测试以断言列表已重建,但在调用方法之前没有清除列表,测试无效.

我们正在使用这个SO答案中的辅助方法来确保模型被验证,然后我们的单元测试是这样的.

    public void MyTest()
    {
        MyController controller = new MyController();

        ActionResult result = controller.AddItem();
        Assert.IsNotNull(result);
        ViewResult viewResult = result as ViewResult;
        Assert.IsNotNull(viewResult);
        ItemViewModel itemData = viewResult.Model as ItemViewModel;
        Assert.IsNotNull(recipe);
        // Validate model, will fail due to null name …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc unit-testing model-binding

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

asp.net核心自定义模型绑定器只适用于一个属性

我的asp.net核心控制器有一个简单的模型:

[HttpPost]
public async Task<DefaultResponse> AddCourse([FromBody]CourseDto dto)
{
     var response = await _courseService.AddCourse(dto);
     return response;
}
Run Code Online (Sandbox Code Playgroud)

我的模型是:

 public class CourseDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Genre { get; set; }
    public string Duration { get; set; }
    public string Level { get; set; }
    public string AgeRange { get; set; }
    public string Notes { get; set; }
    public bool Active { get; set; }
    public string OrganisationCode …
Run Code Online (Sandbox Code Playgroud)

model-binding custom-model-binder asp.net-core-mvc asp.net-core

7
推荐指数
2
解决办法
2566
查看次数

.NET Core Custom模型绑定器调用默认模型绑定器

我正在尝试在.NET Core中实现一些中间件,它将小数位数舍入为2位小数.所有其他映射都可以像现在一样通过ComplexTypeModelBinder.我已经尝试过在我之前调用该绑定器或继承它,但它最终会导致模型在触及控制器时为空.

基本上我的功能与此处要求的相同:从自定义模型Binder中调用默认模型Binder?,但对于.NET核心.

.net model-binding .net-core

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

如何将名为"file []"的已发布数据绑定到MVC模型?

我使用Redactor作为HTML编辑器,它有一个用于上传图像和文件组件.

Redactor负责客户端位,我需要提供服务器端上传功能.

如果我Request.Files在控制器中使用,我没有问题让上传工作.

但我想将发布的文件绑定到模型,我似乎无法做到这一点,因为它们发送的参数是files[]- 名称中带有方括号.

我的问题:

是否可以将发布绑定"file[]"到MVC模型?这是一个无效的属性名称,file单独使用不起作用.


此文件输入如下所示.我可以指定一个名称以外的名称file,但Redactor添加[]到最后,无论名称如何.

<input type="file" name="file" multiple="multiple" style="display: none;">
Run Code Online (Sandbox Code Playgroud)

我试图绑定到这样的属性:

public HttpPostedFileBase[] File { get; set; }
Run Code Online (Sandbox Code Playgroud)

当我看到上传发生时,我在请求中看到了这一点(我认为redactor可能会在幕后添加方括号):

Content-Disposition: form-data; name="file[]"; filename="my-image.jpg"
Run Code Online (Sandbox Code Playgroud)

也相关:

Redactor始终将内容类型的上传请求作为multipart/form-data发送.所以你不需要在任何地方添加这个enctype

asp.net-mvc file-upload model-binding redactor

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