我再一次面对"这不应该是这个?*!#hard"的情况.
问题:我想在MVC中使用表单来创建对象.对象的一个元素是一组有限的选择 - 下拉列表的完美候选者.
但是如果我在我的模型中使用SelectList,并在我的View中使用下拉列表,然后尝试将模型发布回我的Create方法,则会收到错误"Missing Method Exception:No Parameterless constructor for this object".探索MVC源代码,似乎为了绑定到模型,Binder必须能够首先创建它,并且它不能创建SelectList,因为它没有默认的构造函数.
这是简化的代码:对于模型:
public class DemoCreateViewModel
{
public SelectList Choice { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
对于控制器:
//
// GET: /Demo/Create
public ActionResult Create()
{
DemoCreateViewModel data = new DemoCreateViewModel();
data.Choice = new SelectList(new string[] { "Choice1", "Choice2", "Choice3" });
ViewData.Model = data;
return View();
}
//
// POST: /Demo/Create
[HttpPost]
public ActionResult Create(DemoCreateViewModel form)
{
try
{
// TODO: Add insert logic here
return RedirectToAction("Index");
}
catch
{
return View(); …Run Code Online (Sandbox Code Playgroud) 如果是这样,我应该如何传递参数?匹配枚举名称的字符串可以吗?如果我传递的是与枚举项匹配的下拉框,这将非常方便.
如果我能够在提交数据时轻松绑定到枚举,那么使用本答案中提供的解决方案会很有用.
我遇到一个问题,每次我将表单发回到[HttpPost]我的控制器动作版本时,ModelBinder都会返回一个null对象.我无法理解为什么.如果我更改签名以使用FormCollection替代,我可以看到已经设置了所有正确的密钥.有人可以帮我指出这里有什么问题,因为我无法发现它.
以下是处理我的观点的模型
public class DeviceModel
{
public int Id { get; set; }
[Required]
[Display(Name = "Manufacturer")]
public int ManufacturerId { get; set; }
[Required]
[Display(Name = "Model")]
[StringLength(20)]
public string Model { get; set; }
[StringLength(50)]
[Display(Name = "Name")]
public string Name { get; set; }
[StringLength(50)]
[Display(Name = "CodeName")]
public string CodeName { get; set; }
public int? ImageId { get; set; }
}
public class DeviceCreateViewModel : DeviceModel
{
public IEnumerable<SelectListItem> Manufacturers { …Run Code Online (Sandbox Code Playgroud) 好的,这很奇怪.我不能用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)
根本不起作用.如果我按照此处的说明定义BindAttributefor Enquiry类,我可以只做这项工作:
在我的Spring MVC应用程序中,我需要实现一个动态的问卷形式:我有N个问题,每个我都有3个选项.
所以在我的页面中我会有这样的东西:
| Question 1 | 1 | 2 | 3 |
| Question 2 | 1 | 2 | 3 |
| Question 3 | 1 | 2 | 3 |
| ... | 1 | 2 | 3 |
| Question N | 1 | 2 | 3 |
Run Code Online (Sandbox Code Playgroud)
问题存储在数据库中,对于我将使用单选按钮的选项.我将使用forEach标签来修改动态行,但我不知道如何ModelAttribute在这种情况下发布数据和处理绑定...
对于我的模型属性类,这可能是一个很好的结构?是否可以在Spring MVC中使用动态形式的绑定?
我试图在我的ASP.NET MVC 4项目中创建自定义模型绑定器.但我对IModelBinder iterfaces感到困惑.有3个 IModelBinder接口VS可以找到.在以下命名空间中.
using System.Web.Http.ModelBinding;
using System.Web.Mvc;
using System.Web.ModelBinding;
bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext);
bool BindModel(ModelBindingExecutionContext modelBindingExecutionContext, ModelBindingContext bindingContext);
Run Code Online (Sandbox Code Playgroud)
所有相关的类,如ModelBindingContext,ModelMetadata和其他类也都是重复的.我和我的朋友无法找出这种可怕的代码重复的目的是什么.为什么Microsoft开发人员不提取共享程序集的公共类?据我所知,MVC中使用了一个接口,Web Api中有一个接口,第三个版本的目的是什么?这个接口是独立的还是以某种方式相互连接?
我有以下课程:
public class MyDTO {
private String kiosk;
...
}
Run Code Online (Sandbox Code Playgroud)
和以下网址:
http://localhost:1234/mvc/controllerUrl?kiosk=false
Run Code Online (Sandbox Code Playgroud)
并遵循控制器方法:
@RequestMapping(method = RequestMethod.GET, produces = APPLICATION_JSON)
@ResponseBody
public ResponseEntity<List<?>> getRequestSupportKludge(final MyDTO myDTO, BindingResult bindingResult) {
...
}
Run Code Online (Sandbox Code Playgroud)
现在它工作得很好,布尔字段正确解析.
现在url参数已经改变如下:
http://localhost:1234/mvc/controllerUrl?new_kiosk=false
Run Code Online (Sandbox Code Playgroud)
我不想在DTO中更改参数名称.有没有办法说spring知道new_kiosk请求参数值应该放在kiosk字段中?
我在一个全新的MVC Web API项目中重现了我遇到的问题.
这是默认代码,略有修改.
public string Get(int? id, int? something = null)
{
var isValid = ModelState.IsValid;
return "value";
}
Run Code Online (Sandbox Code Playgroud)
如果你去,http://localhost/api/values/5?something=123那么这很好,isValid是true.
如果你去http://localhost/api/values/5?something=那么isValid是false.
我遇到的问题是,如果为可以为空的项提供null或省略的值,ModelState.IsValid会标记验证错误 "A value is required but was not present in the request."
ModelState字典也如下所示:
有两个条目something,一个可以为空,我不确定它是否重要.
知道如何解决这个问题,以便在省略可空参数或提供为null时模型是有效的吗?我在我的web api中使用模型验证,如果每个带有可为空参数的方法都会产生模型错误,它就会破坏它.
如果我在组件的模板中执行类似的操作:
<input [(ngModel)]="myProperty"></input>
Run Code Online (Sandbox Code Playgroud)
然后它工作,但如果我用我的组件中的函数执行它不会:
<input [(ngModel)]="getMyProperty()"></input>
Run Code Online (Sandbox Code Playgroud)
这是傻瓜.在RC6上测试过.为什么?
刚刚使用.NET Core启动了一个新项目.添加了我的Web API控制器和相关方法.使用Postman我创建了一个JSON对象并将其发布到我的控制器方法.请记住,JSON对象与控制器方法中的Object参数完全匹配.
在调试模式下,我可以看到对象,它不是null,属性在那里,但是prop值默认为它们的代表类型,0for int等.
我之前从未见过这种行为......所以我使用了完全相同的代码和对象,并在一个带有Web API 2控制器的MVC项目中进行了复制.
我缺少什么,我不能在.NET Core中POST JSON和模型绑定吗?
阅读这篇文章似乎我不能,除非我发送形式POST或查询字符串变量顺便说一句工作正常.
https://lbadri.wordpress.com/2014/11/23/web-api-model-binding-in-asp-net-mvc-6-asp-net-5/
JSON:
{
"id": "4",
"userId": "3"
"dateOfTest": "7/13/2017"
}
Run Code Online (Sandbox Code Playgroud)
方法:
[HttpPost]
[Route("test1")]
[AllowAnonymous]
public IActionResult Test(Class1 data)
{
return Ok();
}
Run Code Online (Sandbox Code Playgroud) c# model-binding asp.net-web-api2 asp.net-core asp.net-core-webapi
model-binding ×10
asp.net-mvc ×4
c# ×3
asp.net ×2
spring ×2
spring-mvc ×2
.net ×1
angular ×1
asp.net-core ×1
enums ×1
java ×1
selectlist ×1