我将我的Web应用程序从预览3转换为beta1,现在我正在尝试使用框架的新功能.其中之一是ModelBinding.
对于这种特殊情况,我创建了一个类(现在)只是一堆简单类型属性的容器.如果我创建一个包含大量文本框的表单,我希望框架用这些字段填充SearchBag实例.
任何帮助表示赞赏.
我有以下模型类(为简单起见而剥离):
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
我需要显示一个复选框列表,可以检查多个复选框.
当用户点击提交时,这些复选框的值需要进入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)
有人能告诉我我做错了什么吗?
我正在使用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.这里有什么问题?
我们有一些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
所以我有一个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) 我期待编写单元测试来验证我的控制器,同时确保正确设置绑定属性.使用以下方法结构,如何确保仅从单元测试传递有效字段?
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) 我的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
我正在尝试在.NET Core中实现一些中间件,它将小数位数舍入为2位小数.所有其他映射都可以像现在一样通过ComplexTypeModelBinder.我已经尝试过在我之前调用该绑定器或继承它,但它最终会导致模型在触及控制器时为空.
基本上我的功能与此处要求的相同:从自定义模型Binder中调用默认模型Binder?,但对于.NET核心.
我使用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 ×6
c# ×3
.net ×1
.net-core ×1
asp.net-core ×1
checkbox ×1
file-upload ×1
json ×1
redactor ×1
unit-testing ×1
validation ×1
viewmodel ×1