标签: model-binding

MVC简单模型绑定不起作用

好吧,这一定是一些愚蠢的东西,我做错了,但我找不到它.

MVC行动:

[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult Create(BatchCreateViewModel createModel)
{
    return RedirectToRoute(MVC.Home.Display());
}
Run Code Online (Sandbox Code Playgroud)

BatchCreateViewModel:

public class BatchCreateViewModel
{
    bool searchAVM;
    bool searchBPO;
    bool searchAppraisal;
    int transactionAge;
    string Description;
    string uploadfile;
}
Run Code Online (Sandbox Code Playgroud)

View页面上有一些名为"searchAVM","searchBPO","searchAppraisal",(复选框)"transactionAge"(一组带整数值的单选按钮)和"description"(文本框)的控件

当我在"Create"的条目处中断时,createModel就在那里,但是具有所有默认值(对于字符串为null,对于布尔值为false,对于int为0).如果我检查Request.Form,值就在那里,但它们只是没有进入模型.

我究竟做错了什么?

(这是MVC 2,框架4)

model-view-controller asp.net-mvc model-binding

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

ASP.NET MVC 3 JSONP:这适用于JsonValueProviderFactory吗?

Phil Haack有一篇关于如何使用JSON,数据绑定和数据验证的优秀博客文章.

输入浏览器的"同源策略安全限制".和JSONP,您使用$ .getJSON()来检索内容.

是否有内置的MVC 3方法来做到这一点,还是我需要遵循这样的帖子的建议?你可以发布内容吗?我问,因为我的同事实现了JsonPfilterAttribute以及其他工作.如果MVC 3中已存在某些内容,显然最好避免这种情况.

编辑:

总结:除访问POST变量外,一切都有效,即如何POST在上下文中访问变量?(注释在代码的最后部分标记)

我选择使用这种格式来调用服务器:

$.ajax({
    type: "GET",
    url: "GetMyDataJSONP",
    data: {},
    contentType: "application/json; charset=utf-8",
    dataType: "jsonp",
    jsonpCallback: "randomFunctionName"
});
Run Code Online (Sandbox Code Playgroud)

产生这种反应:

randomFunctionName([{"firstField":"111","secondField":"222"}]);
Run Code Online (Sandbox Code Playgroud)

如果我使用的话,这一切都很有效GET.但是,我仍然无法将其作为一个工作POST.这是Nathan Bridgewater 在这里发布的原始代码.此行找不到POST数据:

context.HttpContext.Request["callback"];
Run Code Online (Sandbox Code Playgroud)

要么我应该Form以某种方式访问,要么MVC数据验证器正在剥离POST变量.

如何context.HttpContext.Request["callback"];编写访问POST变量或MVC是否出于某种原因剥离这些值?

namespace System.Web.Mvc
{   public class JsonpResult : ActionResult
    {   public JsonpResult() {}

        public Encoding ContentEncoding { get; set; }
        public string ContentType { get; set; …
Run Code Online (Sandbox Code Playgroud)

jsonp model-binding asp.net-mvc-3

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

如何绑定自定义类型的集合(IEnumerable)?

我有以下操作来显示包含3个项目的表单:

[HttpGet]
    public ActionResult ReferAFriend()
    {
        List<ReferAFriendModel> friends = new List<ReferAFriendModel>();
        ReferAFriendModel f1 = new ReferAFriendModel();
        ReferAFriendModel f2 = new ReferAFriendModel();
        ReferAFriendModel f3 = new ReferAFriendModel();

        friends.Add(f1);
        friends.Add(f2);
        friends.Add(f3);
        return View(friends);
    }
Run Code Online (Sandbox Code Playgroud)

然后是一个Post动作

[HttpPost]
    public ActionResult ReferAFriend(IEnumerable<ReferAFriendModel> friends)
    {
        if(ModelState.IsValid){
Run Code Online (Sandbox Code Playgroud)

编辑 我的视图如下所示:

@model IEnumerable<Models.ReferAFriendModel>
@for(int i=0;i<Model.Count();i++)
    {
        @Html.Partial("_ReferAFriend", Model.ElementAt(i));
    }
Run Code Online (Sandbox Code Playgroud)

部分看起来像这样:

@model Models.ReferAFriendModel
<p>
   @Html.LabelFor(i => i.FullName) @Html.TextBoxFor(i => i.FullName)<br />
   @Html.LabelFor(i => i.EmailAddress) @Html.TextBoxFor(i => i.EmailAddress)
   @Html.HiddenFor(i=>i.Id)
</p>
Run Code Online (Sandbox Code Playgroud)

当我发帖时,我可以看到字段在Request.Form对象中发布,例如Request.Form ["FullName"]将显示:"David Beckham","Thierry Henry"."Chicharito Fergurson"是我在表格中输入的值.但是,在Post动作中,'friends'的值始终为null.ReferAFriendModel有三个公共属性Id,EmailAddress和FullName.

我究竟做错了什么?

c# asp.net-mvc model-binding razor asp.net-mvc-3

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

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

使用jQuery Ajax调用的MVC没有正确绑定空数组/可枚举

我有一个jQuery ajax调用,我试图发送用户的int ID,可以从复选框表中选择.

我遇到的问题是没有选择用户.我期望一个空数组,但实际上我收到一个长度= 1的数组,包含userId 0(即一个未赋值的int值).

以下代码段再现了该问题

$('#test').click(function () {
    var numbers = $('.noElements').map(function () {
        // (selector does not match any elements, to demonstrate)
        return 1;
    }).get();

    $.ajax({
        url: '/MyController/Test',
        type: "GET",
        data: { numbers: numbers, count: numbers.length }
    });
});


public ActionResult Test(IEnumerable<int> numbers, int count)
{
    Assert(numbers.Count() == count);
    return null;
}
Run Code Online (Sandbox Code Playgroud)

断言失败,因为numbersList<int> { 0 }.绑定为什么会这样发生?

c# ienumerable jquery model-binding asp.net-mvc-3

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

如何在自定义模型绑定器中检查属性属性

我想强制我的系统中的所有日期都有效,而不是将来,所以我在自定义模型绑定器中强制执行它们:

class DateTimeModelBinder : IModelBinder {
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        try {
            var date = value.ConvertTo(typeof(DateTime), CultureInfo.CurrentCulture);

            // Here I want to ask first if the property has the FutureDateAttribute
            if ((DateTime)date > DateTime.Today) {
                bindingContext.ModelState.AddModelError(bindingContext.ModelName, "No se puede indicar una fecha mayor a hoy");
            }

            return date;
        }
        catch (Exception) {
            bindingContext.ModelState.AddModelError(bindingContext.ModelName, "La fecha no es correcta");
            return value.AttemptedValue;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,除了少数例外,我想允许将来有些日期

    [Required]
    [Display(Name = "Future Date")]
    [DataType(DataType.DateTime)]
    [FutureDateTime] <-- this …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc model-binding

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

MVC Razor视图中的HTML.Textarea值

我很难清楚地说出我遇到的问题.我试图了解如何在验证失败后保留在循环中创建的表单字段中的值.我有一个更复杂的真实世界形式,在循环和验证中创建了一堆元素.我把它简化为一个简单的例子,包括在下面.

当验证失败时,我希望在循环中创建的名为"Comment"的textareas保留下面的Pre-Submit图像中显示的值.

当我调试表单提交时,每个字段的值都成功连接到模型中名为Comment的IList变量.这就是我想要的,所以我可以循环并根据索引找到它们.

提交后,循环生成的每个textarea显示模型中IList变量Comment的逗号分隔表示.看来视图和模型中的字段是连接的,因为它们共享一个名称.它们在途中正确连接但不在出路上.我希望视图只显示与Comment [i]相关的值而不是整个列表,以便值在表单提交之间保持不变.

屏幕截图和 首次加载下的示例代码
:
首次加载表单而不做任何更改

提交表格更改:
在提交之前更改第一个输入的表单

首次提交后看到的表格:
表格如首次提交后所见

第二次提交后看到的表格:
在此输入图像描述

型号代码

using System.Collections.Generic;
namespace UI.Models.Forms
{
    public class TempListModel : ContentModel
    {
        public TempListModel()
        {
            Comment = new List<string>();
        }
        public IList<string> Comment { get; set; }  //Comments for each URL in the list
    }
}
Run Code Online (Sandbox Code Playgroud)


查看代码

@model UI.Models.Forms.TempListModel  
@using (Html.BeginForm("temptest", "Test", new { id = 1 }, FormMethod.Post, new { id = "listForm", name = "listForm" }))
{
    <ul>
        @for (int i = 0; i < Model.Comment.Count(); …
Run Code Online (Sandbox Code Playgroud)

html c# asp.net-mvc model-binding razor

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

如何在ASP.NET MVC Web API中修剪模型空间

修剪传递给MVC web api的模型的所有属性的最佳方法是什么(使用复杂对象的post方法).可以做的一件事就是在所有属性的getter中调用Trim函数.但是,我真的不喜欢那样.

我希望简单的方法类似于MVC中提到的ASP.NET MVC:在数据输入后修剪字符串的最佳方法.我应该创建自定义模型绑定器吗?

asp.net-mvc trim model-binding

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

Asp.Net MVC 4自动绑定表单中对象数组的模型

我在JavaScript中构建了一个对象数组,并希望通过Ajax将它们发布回服务器(我使用jQuery)

JavaScript对象数组如下所示:

var columns = [
    { name: 'col 1', source: 'whatever', hidden: false, width: 50 },
    ...
];
Run Code Online (Sandbox Code Playgroud)

我发布回来像这样:

$.post('/MyController/MyAction', { 'columns': columns });
Run Code Online (Sandbox Code Playgroud)

在控制器操作我目前得到这个:

在此输入图像描述

我有一个ac#object叫JqColumn我想绑定帖子,它看起来像这样:

public class JqGridColumn
{
    public string name;
    public string source;
    public int width;
    public bool hidden;
}
Run Code Online (Sandbox Code Playgroud)

所以我认为在类型的控制器动作中添加一个参数JqGridColumn[] columns会自动绑定发布的数据,但它不会(它生成一个数组,具有正确的元素数,但数组中的每个项都有空值)

谁能告诉我我做错了什么?谢谢!

UPDATE

目前,我手动绑定控制器操作中的项目如下:

    public void ColumnChooser(JqGridColumn[] columns)
    {
        for (int i = 0; i < columns.Length; i++)
        {
            columns[i].hidden = bool.Parse(Request.Form["columns[" + i + "][hidden]"]);
            columns[i].width = int.Parse(Request.Form["columns[" + i …
Run Code Online (Sandbox Code Playgroud)

javascript arrays asp.net-mvc form-post model-binding

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

如何将名为"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
查看次数