好吧,假设我有一个像这样的URL,它通过HTTP动词映射GET
到我在下面的控制器操作:
GET /foo/bar?sort=asc&r=true
Run Code Online (Sandbox Code Playgroud)
如何Bar
在我的控制器操作上将其绑定到我的模型,我在下面:
class Bar {
string SortOrder { get; set; }
bool Random { get; set; }
}
public ActionResult FooBar(Bar bar) {
// Do something with bar
return null;
}
Run Code Online (Sandbox Code Playgroud)
请注意,属性名称不会也不一定与URL参数的名称匹配.此外,这些是可选的url参数.
public ActionResult SomeAction(int Id){
//Id is set to 2
var model = //get some thing from db using Id(2);
//Now model.Id is set to 9;
return View(model);
}
----------View----------
@Html.HiddenFor(x => x.Id)
Run Code Online (Sandbox Code Playgroud)
当我查看源时,此隐藏字段设置为2而不是9.如何将其映射到模型而不是映射到URL路由信息?
PS我不想重命名参数因为那时我会丢失我看起来很漂亮的网址,除非我改变路由信息.我已经做到了,它确实有效,但不是我想要的.
将IEnumerable类型的模型绑定到MVC POST是否有任何问题?
我的模型中的某些属性未绑定到操作的帖子.似乎模型上的属性就像字符串一样好,但我的IEnumerable是没有绑定的.
这是我的代码片段:
<%: Html.TextBoxFor(m => m.ResponseInfo.SubsetInfo.Test) %>
<% for (int i = 0; i < Model.ResponseInfo.SubsetInfo.BandAvailabilities.Count(); i++)
{%>
<%: Html.TextBoxFor(m => m.ResponseInfo.SubsetInfo.BandAvailabilities.ToArray()[i].BandName) %>
<% } %>
Run Code Online (Sandbox Code Playgroud)
以下是这些属性在模型中的样子:
public IEnumerable<BandAvailabilityInfo> BandAvailabilities { get; set; }
public string Test { get; set; }
Run Code Online (Sandbox Code Playgroud)
视图工作正常,并输出一个文本框列表,其中包含预期值.但是被解雇的帖子只会将Test字符串识别为属性.模型状态也不包含我的IEnumerable数据.
我最近开始使用MVC而且我很少失望.框架正在阻碍我,而不是帮助我.
我正在尝试编写这样的控制器动作(伪代码)
ActionResult Save(long id, string whichForm)
{
if (whichForm == "A")
{
var vm = CreateModel(Request.Form);
if (!TryValidate(vm))
return View(vm);
else
return RedirectToRoute("Success");
}
else ....
}
Run Code Online (Sandbox Code Playgroud)
基本上我想控制构建视图模型的时间以及何时验证它.这可能吗?如何实现CreateModel方法?考虑我可能想在此控制器操作中创建几个不同的视图模型.
*Rant:我真的不明白为什么在DefaultModelBinder中将视图模型绑定和验证混合在一起.好像代码味道.特别是当它很难覆盖这种行为时.
简而言之:如何成功编辑数据库条目而无需在编辑视图中包含模型的每个字段?
更新
所以我在DB(文章)中有一个项目.我想编辑一篇文章.我编辑的文章有很多属性(Id,CreatedBy,DateCreated,Title,Body).其中一些属性永远不需要更改(如Id,CreatedBy,DateCreated).因此,在我的编辑视图中,我只想要可以更改的字段的输入字段(如标题,正文).当我像这样实现编辑视图时,模型绑定失败.我没有提供输入的任何字段都设置为某个"默认"值(如DateCreated设置为01/01/0001 12:00:00 am).如果我确实为每个字段提供输入,一切正常,文章按预期编辑.我不知道是否正确地说"模型绑定失败"是必要的,如果"如果在编辑视图中没有为它们提供输入字段,则系统会填充包含不正确数据的字段".
如何以这样的方式创建编辑视图:我只需要为可以/需要编辑的字段提供输入字段,以便在调用Controller中的Edit方法时,正确填充DateCreated等字段,而不设置某些默认值,不正确的值?这是我目前的编辑方法:
[HttpPost]
public ActionResult Edit(Article article)
{
// Get a list of categories for dropdownlist
ViewBag.Categories = GetDropDownList();
if (article.CreatedBy == (string)CurrentSession.SamAccountName || (bool)CurrentSession.IsAdmin)
{
if (ModelState.IsValid)
{
article.LastUpdatedBy = MyHelpers.SessionBag.Current.SamAccountName;
article.LastUpdated = DateTime.Now;
article.Body = Sanitizer.GetSafeHtmlFragment(article.Body);
_db.Entry(article).State = EntityState.Modified;
_db.SaveChanges();
return RedirectToAction("Index", "Home");
}
return View(article);
}
// User not allowed to edit
return RedirectToAction("Index", "Home");
}
Run Code Online (Sandbox Code Playgroud)
编辑视图是否有帮助:
. . .
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Article</legend>
<p>
<input type="submit" value="Save" …
Run Code Online (Sandbox Code Playgroud) 在看完Simon的这篇优秀博客文章后,我发现模型绑定比过滤器执行更早(甚至在授权过滤器之前).如果请求未被授权,则应尽可能早地拒绝该请求,在这种情况下,我更喜欢在模型绑定过程之前运行授权过滤器.此外,通过这种方式,我们可以节省时间,避免扫描请求,创建模型实例和执行验证.
有什么理由我根本不明白为什么MVC请求处理管道设计的方式是模型绑定应该在过滤器之前发生?
我正在渲染键:使用ng-repeat的值对象数组,如下所示:
<div ng-controller="mainCtrl">
<div ng-repeat="record in records">
<div ng-repeat="(key, value) in record">
<input ng-model="key" />: <input ng-model="value" />
</div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
JS:
var mainCtrl = function($scope){
$scope.records = [
{'key1':'val1'},
{'key2':'val2'}
];
}
Run Code Online (Sandbox Code Playgroud)
问题是无法通过输入标签更新键和值.由于某种原因,在使用ng-repeat迭代(键,值)之后,它成为单向绑定.
小提琴: http ://jsfiddle.net/BSbqU/1/
我怎样才能使它成双向绑定?或者我应该以不同的方式处理此问题然后嵌套ng-repeat?
我有一个WebApi方法,像这样:
public string Get([FromUri] SampleInput input)
{
//do stuff with the input...
return "ok";
}
Run Code Online (Sandbox Code Playgroud)
输入定义如下:
public class SampleInput
{
// ...other fields
public bool IsAwesome { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
实际上,它可以正常工作:如果我传入&isAwesome=true
查询字符串,则参数将使用值进行初始化true
.
我的问题是,我想接受这两个 &isAwesome=true
和&isAwesome=1
作为true
价值观.目前,第二个版本将导致IsAwesome
被false
输入模型.
在阅读有关该主题的各种博客文章之后,我尝试的是定义HttpParameterBinding
:
public class BooleanNumericParameterBinding : HttpParameterBinding
{
private static readonly HashSet<string> TrueValues =
new HashSet<string>(new[] { "true", "1" }, StringComparer.InvariantCultureIgnoreCase);
public BooleanNumericParameterBinding(HttpParameterDescriptor descriptor) : base(descriptor)
{
}
public override Task ExecuteBindingAsync( …
Run Code Online (Sandbox Code Playgroud) 我试图在web api控制器中从我的Post Action中排除一个属性,是否有像[Bind(Exclude="Property")]
asp.net web api 这样的东西?
这是我的模特:
public class ItemModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想在Post Action中排除Id,因为它是自动生成的,但我需要在Get Action中返回它.
我知道我可以有两个模型,一个用于我的Post动作,一个用于我的Get动作,但我只想用一个模型做这个.
我有以下型号
public class PageConfig : Base
{
// Properties Etc..
public ICollection<Image> ScrollerImages { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的方法是使用联结表{PageConfigID,ImageID}进行绑定.
在我的模型活页夹中我尝试了以下..
modelBuilder.Entity<PageConfig>()
.HasMany(x => x.ScrollerImages)
.WithMany()
.Map(x =>
{
x.ToTable("junc_PageConfigScrollerImages");
x.MapLeftKey("PageConfigID");
x.MapRightKey("ImageID");
});
Run Code Online (Sandbox Code Playgroud)
这导致图像的空集合.
如何将这些图像绑定到PageConfig模型?
编辑
大多数问题是由于用户错误.这发生在你身上......
检查数据库中的键约束是否已正确设置.
模型上的ICollection NEEDS是虚拟的.
c# entity-framework one-to-many model-binding junction-table
model-binding ×10
asp.net-mvc ×5
c# ×4
angularjs ×1
ienumerable ×1
lambda ×1
one-to-many ×1
viewmodel ×1