是否可以将我的模型上的外键关系绑定到表单输入?
说我Car和之间有一对多的关系Manufacturer.我想要一个更新表单,Car其中包括用于设置的选择输入Manufacturer.我希望能够使用内置的模型绑定来做到这一点,但我开始认为我必须自己做.
我的动作方法签名如下所示:
public JsonResult Save(int id, [Bind(Include="Name, Description, Manufacturer")]Car car)
Run Code Online (Sandbox Code Playgroud)
表单发布值Name,Description和Manufacturer,其中Manufacturer是类型的主键int.名称和描述设置正确,但不是制造商,这是有道理的,因为模型绑定器不知道PK字段是什么.这是否意味着我必须写一个IModelBinder它知道这个的自定义?我不确定这是如何工作的,因为我的数据访问存储库是通过每个Controller构造函数上的IoC容器加载的.
我想允许"123.45"和"123,45"作为有效的十进制输入,但目前"123.45"结果"The value '123.45' is not valid for Foo".
我有一个ASP.NET MVC 3应用程序,它使用Ninject来解决依赖关系.到目前为止,我必须做的就是使Global文件继承NinjectHttpApplication,然后重写CreateKernel方法以映射我的依赖项绑定.之后,我能够在我的MVC控制器构造函数中包含接口依赖项,并且ninject能够解析它们.一切都很棒.现在我想在模型绑定器中解决依赖关系,当它创建我的模型的实例时,但我不知道如何做到这一点.
我有一个视图模型:
public class CustomViewModel
{
public CustomViewModel(IMyRepository myRepository)
{
this.MyRepository = myRepository;
}
public IMyRepository MyRepository { get; set; }
public string SomeOtherProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个接受视图模型对象的action方法:
[HttpPost]
public ActionResult MyAction(CustomViewModel customViewModel)
{
// Would like to have dependency resolved view model object here.
}
Run Code Online (Sandbox Code Playgroud)
如何覆盖默认模型绑定器以包含ninject并解决依赖关系?
c# asp.net-mvc dependency-injection model-binding asp.net-mvc-3
我正在使用MVC控制器开发REST API.我想处理所有模型绑定错误,并以用户友好的方式将它们报告给客户端.在我的自定义模型绑定器中,我已经抛出了一个特殊异常,它被异常处理程序认为是安全的并显示给客户端.
但是,当默认模型绑定器看到无效值(例如,asdf对于a int)时,它似乎要么完全忽略它(如果参数不需要),要么抛出一个普通模型ArgumentException(如果需要参数).是否可以可靠地处理这两种情况并获取参数名称和相关错误,而无需手动重写整个活页夹?
我宁愿不显示ArgumentException它是因为它揭示了客户端不应该关心的方法和命名空间名称.ArgumentException如果消息可以避免,我也不会解析消息,并且无法解决完全忽略非必需参数的无效值的问题.
我试图将用户输入的HTML字符串从POST绑定到模型对象上的简单字符串变量.如果我使用该[AllowHtml]属性,这工作正常.但是,我想在进入模型之前清理HTML,因此我创建了一个ModelBinder:
public class SafeHtmlModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerCtx, ModelBindingContext bindingCtx)
{
var bound = base.BindModel(controllerCtx, bindingCtx);
// TODO - return a safe HTML fragment string
return bound;
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个CustomModelBinderAttribute:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class SafeHtmlModelBinderAttribute : CustomModelBinderAttribute
{
public SafeHtmlModelBinderAttribute()
{
binder = new SafeHtmlModelBinder();
}
private IModelBinder binder;
public override IModelBinder GetBinder()
{
return binder;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我使用new属性注释我想要清理的模型属性:
[Required(AllowEmptyStrings = false, ErrorMessage = "You must fill …Run Code Online (Sandbox Code Playgroud) 鉴于控制器:
public class MyController : ApiController
{
public MyResponse Get([FromUri] MyRequest request)
{
// do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
而型号:
public class MyRequest
{
public Coordinate Point { get; set; }
// other properties
}
public class Coordinate
{
public decimal X { get; set; }
public decimal Y { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
API网址:
/api/my?Point=50.71,4.52
Run Code Online (Sandbox Code Playgroud)
我想在到达控制器之前从查询字符串值转换Point类型的属性.Coordinate50.71,4.52
我在哪里可以加入WebAPI来实现它?
我有很多类似的ViewModel:
public class RequestForSalaryVM : StatementViewModel
{
// RequestForSalaryVM properties
}
public class ReliefVM : StatementViewModel
{
// ReliefVM properties
}
Run Code Online (Sandbox Code Playgroud)
和很多类似的方法:
[HttpPost]
public ActionResult SaveRelief(User currentUser, ReliefVM statement)
{
ReliefVM model = (ReliefVM)SaveModel(currentUser, statement);
if (model == null)
return RedirectToAction("List");
return View("Relief", model);
}
[HttpPost]
public ActionResult SaveRequestForSalary(User currentUser, RequestForSalaryVM statement)
{
RequestForSalaryVM model = (RequestForSalaryVM)SaveModel(currentUser, statement);
if (model == null)
return RedirectToAction("List");
return View("RequestForSalary", model);
}
Run Code Online (Sandbox Code Playgroud)
我想得到这样的东西:
[HttpPost]
public ActionResult SaveStatement(User currentUser, FormCollection statement, string ViewModelName)
{
Assembly …Run Code Online (Sandbox Code Playgroud) 这是困难的一个.我有一个从JSON绑定模型的问题.我试图解决多态一致的记录提供的记录,它将解析为(我希望将来能够添加许多记录类型).我试图在调用端点时使用以下示例来解析我的模型,但是此示例仅适用于MVC而不适用于Web API应用程序.
我试图使用IModelBinder和BindModel(HttpActionContext actionContext,ModelBindingContext bindingContext)来编写它.但是我在System.Web.Http命名空间中找不到ModelMetadataProviders的等价物.
感谢任何人都能给予的帮助.
我有一个Web API 2应用程序,它具有以下对象结构.
public abstract class ResourceRecord
{
public abstract string Type { get; }
}
public class ARecord : ResourceRecord
{
public override string Type
{
get { return "A"; }
}
public string AVal { get; set; }
}
public class BRecord : ResourceRecord
{
public override string Type
{
get { return "B"; }
}
public string BVal { get; set; }
}
public class RecordCollection
{
public string …Run Code Online (Sandbox Code Playgroud) 我有一个带有嵌套对象的复杂模型。我只希望我的[Required]属性在它们所在的对象不是null. 因此,例如,如果我有一个Home带有Address属性的类,则该Home.Address.Street属性应该仅[required]在Addressis not 时为null。
在 ASP.NET Core 中,我有一个如下所示的模型:
public class Home
{
[Required]
public int Number {get;set;}
public Address Address {get;set;} // This is not required
}
Run Code Online (Sandbox Code Playgroud)
public class Address
{
[Required]
public string Street {get;set;}
public IFormFile Picture {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
在控制器中,我有一个如下所示的操作方法:
[HttpPost]
public string AddHomes([FromForm]List<Home> homes)
{
if(!ModelState.IsValid)
{
return BadRequest();
}
// Do some saving
return Ok();
}
Run Code Online (Sandbox Code Playgroud)
表单有效负载如下所示:
homes.Index: 0 …Run Code Online (Sandbox Code Playgroud) c# validation model-binding asp.net-core asp.net-core-webapi
model-binding ×10
c# ×7
asp.net-mvc ×5
.net ×2
asp.net ×2
asp.net-core ×2
decimal ×1
dictionary ×1
validation ×1