我一直在阅读AutoMapper,因为我在这里回答了我之前的一个问题.
它说AutoMapper会使复杂的域模型变得扁平化,但我需要的是相反的东西.我需要将我的视图模型(展平的域模型)连接到复杂的域模型,以便我可以快速将视图模型转换为域模型.
有没有类似于AutoMapper的东西采用视图模型并使其成为一个复杂的域模型?
我希望能够在ASP.Net MVC中向我的控制器发布帖子时发送JSON而不是标准的QueryStrings.我有前端工作正常(构建然后提交我的JSON对象).
问题出在控制器端,MVC框架附带的默认ModelBinder不支持此功能.
我已经看到了各种方法,其中之一是应用一个过滤器,它将对象作为参数,使用JSON库对其进行反序列化,并将其添加到操作参数中.这不太理想.
另一种更好的方法是使用自定义Model Binder.我见过的所有人都认为你只有一个模型而且它将是一个类而不是一个变量.如果你有多个,它会崩溃.
有人遇到过这种情况么?我有一个想法,如果我可以简单地覆盖MVC如何处理FormCollection并拦截那里,我自己将值添加到集合中,并希望MVC能够以正常的方式完成剩下的工作.有谁知道这是否可能?
我认为关键问题是我的问题不在于绑定,因为我的视图模型与之前的模型没有什么不同.问题是从JSON Post获取值.
如果我是正确的MVC获取QueryString中的值并将其放入表单集合中,然后将其用于ModelBinding.那么正确的方法是不应该改变FormCollection的分配方式?
动作示例:
public ActionResult MyFirstAction(Int32 ID, PersonObject Person, ClassObject ClassDetails)
{
//etc
}
Run Code Online (Sandbox Code Playgroud)
正常的绑定工作,JSON没有,模型绑定器的所有示例都不起作用.到目前为止,我最好的解决方案是将对象转换为字典并循环遍历每个参数并匹配它.看起来不太理想.
我有以下类型和类:
namespace MVC.Models
public class Page
{
public EditableContent Content {get; set; }
}
public class EditableContent
{
public TemplateSection SidebarLeft {get; set; }
public TemplateSection SidebarRight {get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想Page在我的Edit.aspx视图中编辑实例.因为EditableContent它也附加到其他模型,我有一个强类型的PartialView调用ContentEditor.ascx,并获取EditableContent并呈现它的实例.
渲染部分一切正常,但是当我发布时 - 我内部的所有内容都ContentEditor没有绑定 - 这意味着Page.Content就是这样null.
在PartialView上,我使用强类型的Html Helpers来执行此操作:
<%= Html.HiddenFor(m => m.TemplateId) %>
Run Code Online (Sandbox Code Playgroud)
但是因为表单上的输入元素ContentEditor.ascx没有获得Content其id属性的前缀- 这些值没有绑定到Page.
我尝试使用松散类型的助手来克服这个问题:
<%= Html.Hidden("Content.TemplateId", Model.TemplateId) %>
Run Code Online (Sandbox Code Playgroud)
当我正在处理一个List<T>非常丑陋的财产时.然后我必须手动渲染集合索引. …
如果我有以下jQuery函数(在外部文件中):
function getResults(field1, field2, field3) {
$.get('/Search/GetResults', { id: field1, type: field2, blah: field3 }, function(data) {
$('#target').html(data);
});
}
Run Code Online (Sandbox Code Playgroud)
这基本上从表单中获取了一堆字段,将它们发送到一个action方法(返回一个PartialViewResult),并将结果绑定到一个目标div.
这是动作方法:
[HttpGet]
public PartialViewResult GetResults(int id, int type, string blah)
{
var model = repository.GetResults(id, type, blah);
return PartialView("Results", model);
}
Run Code Online (Sandbox Code Playgroud)
这里可以使用模型绑定吗?我们可以这样做:
function getResults(someModel) {
$.get('/Search/GetResults', { model: someModel }, function(data) {
$('#target').html(data);
});
}
Run Code Online (Sandbox Code Playgroud)
还有这个:
[HttpGet]
public PartialViewResult GetResults(SearchPreferences prefs)
{
var model = repository.GetResults(prefs);
return PartialView("Results", model);
}
Run Code Online (Sandbox Code Playgroud)
或者我应该构建一个JSON对象并传递它?目前,这些值是通过单独的jQuery DOM调用检索的:
var field1 = $('#field1').val();
var field2 = …Run Code Online (Sandbox Code Playgroud) 我的应用程序有许多模型,其中许多包含百分比数据.这些在模型中表示为decimal或decimal?结构.但是,并非所有具有decimal结构的属性都是百分比.有些应该像常规小数一样对待.
百分比需要特别注意:
{0:P2}格式.(我有这部分工作.)我开始走上创建之路PercentModelBinder实现IModelBinder,但后来意识到,你只能应用ModelBinderAttribute到类,而不是一个属性.
处理这种情况的最佳方法是什么,某种类型的(但不是全部)使用需要对显示和绑定进行特殊处理?
我认为每个解决方案都有过分杀戮,与MVC框架作斗争.当然有一种比以下更好的方法:
Percentage结构并将其用作IModelBinder和EditorTemplates的基础,或decimal并decimal?根据对模型的深入了解来改变解析逻辑,或者正如我从下面的问题中理解的那样,应该可以为Get和Post操作使用不同的模型.但不知何故,我未能实现这一目标.
我错过了什么?
相关问题:在控制器操作中使用两个不同的模型进行POST和GET
模型
public class GetModel
{
public string FullName;
public string Name;
public int Id;
}
public class PostModel
{
public string Name;
public int Id;
}
Run Code Online (Sandbox Code Playgroud)
调节器
public class HomeController : Controller
{
public ActionResult Edit()
{
return View(new GetModel {Id = 12, Name = "Olson", FullName = "Peggy Olson"});
}
[HttpPost]
public ActionResult Edit(PostModel postModel)
{
if(postModel.Name == null)
throw new Exception("PostModel was not filled correct");
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
视图
@model MvcApplication1.Models.GetModel
@using (Html.BeginForm()) …Run Code Online (Sandbox Code Playgroud) 该模型:
public class UploadFileModel
{
public int Id { get; set; }
public string FileName { get; set; }
public HttpPostedFileBase File { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
控制器:
public void Post(UploadFileModel model)
{
// never arrives...
}
Run Code Online (Sandbox Code Playgroud)
我收到了一个错误
"没有MediaTypeFormatter可用于从媒体类型为'multipart/form-data'的内容中读取'UploadFileModel'类型的对象."
有没有办法解决?
我需要将传入的HTTP POST请求与正文中的数据绑定到具体类型,具体取决于ProductType数据中的分母.这是我的Web API 2操作方法:
[HttpPost, Route]
public HttpResponseMessage New(ProductBase product)
{
// Access concrete product class...
if (product is ConcreteProduct)
// Do something
else if (product is OtherConcreteProduct)
// Do something else
}
Run Code Online (Sandbox Code Playgroud)
我首先考虑使用自定义模型绑定器,但似乎无法在此时访问请求主体:
对于复杂类型,Web API尝试使用媒体类型格式化程序从邮件正文中读取值.
我无法真正看到媒体类格式化器如何解决这个问题,但我可能会遗漏一些东西.你会如何解决这个问题?
我试图在我的视图中将一个Object数组发布到我的控制器但是params为null我看到只是一个简单的对象我需要将[FromBody]放在我的控制器动作中.
这是我的JSON:
{
"monJour": [
{
"openTime": "04:00",
"closedTime": "21:30",
"id": "0"
},
{
"openTime": "08:00",
"closedTime": "17:30",
"id": "1"
},
{
"openTime": "08:00",
"closedTime": "17:30",
"id": "2"
},
{
"openTime": "08:00",
"closedTime": "17:30",
"id": "3"
},
{
"openTime": "08:00",
"closedTime": "17:30",
"id": "4"
},
{
"openTime": "08:00",
"closedTime": "17:30",
"id": "5"
},
{
"openTime": "08:00",
"closedTime": "17:30",
"id": "6"
}
]
}
Run Code Online (Sandbox Code Playgroud)
这是我的Ajax请求:
function SendAllDay() {
var mesJours = {};
var monJour = [];
mesJours.monJour = monJour;
var senddata …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种在控制器中执行动作后解析模型的方法,描述问题的最简单方法是:
public DTO[] Get(string filterName)
{
//How can I do this
this.Resolve<MyCustomType>("MyParamName");
}
Run Code Online (Sandbox Code Playgroud)
如果您正在寻找有关我为什么要这样做的更多信息,则可以继续阅读以获取完整信息。
TL; DR
我正在寻找一种解决模型请求的方法,给定一个始终从查询字符串中解析的参数名称,该如何从启动中动态注册过滤器。我有一个要处理注册过滤器的类。
在启动类中,我希望能够向我的restServices动态注册过滤器。我有一个用来传递给我的自定义ControllerFeatureProvider的选项,大致如下所示:
public class DynamicControllerOptions<TEntity, TDTO>
{
Dictionary<string, Func<HttpContext, Expression<Func<TEntity, bool>>>> _funcNameToEndpointResolverMap
= new Dictionary<string, Func<HttpContext, Expression<Func<TEntity, bool>>>>();
Dictionary<string, List<ParameterOptions>> _filterParamsMap = new Dictionary<string, List<ParameterOptions>>();
public void AddFilter(string filterName, Expression<Func<TEntity, bool>> filter)
{
this._funcNameToEndpointResolverMap.Add(filterName, (httpContext) => filter);
}
public void AddFilter<T1>(string filterName, Func<T1, Expression<Func<TEntity, bool>>> filterResolver,
string param1Name = "param1")
{
var parameters = new List<ParameterOptions> { new ParameterOptions { Name = param1Name, Type …Run Code Online (Sandbox Code Playgroud) model-binding ×10
asp.net-mvc ×6
c# ×4
json ×2
.net ×1
.net-core ×1
asp.net-core ×1
automapper ×1
domain-model ×1
file-upload ×1
jquery ×1
model ×1
rest ×1
viewmodel ×1