好吧,这一定是一些愚蠢的东西,我做错了,但我找不到它.
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)
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) 我有以下操作来显示包含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.
我究竟做错了什么?
我有以下模型类(为简单起见而剥离):
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
我有一个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)
断言失败,因为numbers是List<int> { 0 }.绑定为什么会这样发生?
我想强制我的系统中的所有日期都有效,而不是将来,所以我在自定义模型绑定器中强制执行它们:
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) 我很难清楚地说出我遇到的问题.我试图了解如何在验证失败后保留在循环中创建的表单字段中的值.我有一个更复杂的真实世界形式,在循环和验证中创建了一堆元素.我把它简化为一个简单的例子,包括在下面.
当验证失败时,我希望在循环中创建的名为"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) 修剪传递给MVC web api的模型的所有属性的最佳方法是什么(使用复杂对象的post方法).可以做的一件事就是在所有属性的getter中调用Trim函数.但是,我真的不喜欢那样.
我希望简单的方法类似于MVC中提到的ASP.NET MVC:在数据输入后修剪字符串的最佳方法.我应该创建自定义模型绑定器吗?
我在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) 我使用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
model-binding ×10
asp.net-mvc ×7
c# ×5
razor ×2
arrays ×1
file-upload ×1
form-post ×1
html ×1
ienumerable ×1
javascript ×1
jquery ×1
jsonp ×1
redactor ×1
trim ×1
validation ×1